题解 | #井然有序之衡#
井然有序之衡
https://ac.nowcoder.com/acm/contest/95323/G
输入描述:第一行输入一个整数 n( 1 ≤ n ≤ 10^5 )代表数组中的元素数量。第二行输入 n 个整数 a1,a2,…,an ( −10^9 ≤ ai ≤ 10^9 ) 代表数组元素。
法1:如果能变成数列,则数组和=数列和;求操作次数,先排序,每个数-序号的值的绝对值和 是操作数的两倍
#include<bits/stdc++.h> using namespace std; int main(){ int n, ns[100011]; /*ns存数*/ long long sum1=0,sum2=0,sum3=0; /*sum1是排列的总和,sum2是数组的总和,sum3是操作次数*/ //特别注意:一直卡着不过的原因是 忽视了和的大小会超过10的9次方!!! scanf("%d",&n); for(int i=1;i<n+1;i++){ /*输入数,并求和*/ scanf("%d",&ns[i]); sum1=sum1+i; sum2=sum2+ns[i]; } if(sum1==sum2){ /*排序,并求操作次数*/ sort(ns+1,ns+n+1); /*原操作有误,每个数都可能大于或小于i for(int i=1;i>ns[i];i++){ sum3=sum3+i-ns[i]; }*/ for(int i = 1;i <= n;i++){ if(i < ns[i])sum3 = sum3 + ns[i] - i; } cout << sum3; } else{ cout << "-1"; } return 0; }教训:
1,做题先看数据范围!!还要看如果求和,和是否超出范围 ! ! !