C T3 最少移动
题面
https://ac.nowcoder.com/acm/contest/7612/C
思路
原题,首先考虑能不能均分,如果能均分显然 能被
整除。
如果能整除,那么考虑下面这样的序列
显然是两个 需要分给
怎么分呢?
仔细观察上面这个过程,其实“分”的过程等于向右边“借”的过程,我们只要知道平均数,然后直接问右边要,右边的数自然会向他的右边要,就算出现了负数也没问题。
于是,代码就非常显然了。记得开 long long
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
using std::cin;using std::cout;using std::cerr;using std::endl;
#define rep(i,a,b) for(int i = a;i <= b;++i)
#define per(i,a,b) for(int i = a;i >= b;--i)
const int mmax = 1e5;
long long l,r,ans,sum;
long long T,n,a[mmax + 10];
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0);
cin>>T;
while(T--){
cin>>n;
l = 1,r = n,ans = 0,sum = 0;
rep(i,1,n){
cin>>a[i];
sum += a[i];
}
if(sum % n){
cout<<-1<<endl;
continue;
}
sum /= n;
rep(i,1,n){
ans += std::abs(sum - a[i]);
a[i + 1] += a[i] - sum;
}
cout<<ans<<endl;
}
return 0;
} 
京公网安备 11010502036488号