C-最少移动
思路
这道题可以用前缀和做。
为序列元素,
为前缀和元素。
不难发现,当 时,
,而
不变。
同理,当 时,
,而
仍不变。
当 中所有元素相等时,
一定是一个等差数列。
举个例子:
所以可以得到结论:当 时,
中的元素不可能成等差数列,因此
中的元素不可能相等,无解。 反之则有解。
由上方发现的规律可知:在变换过程中, 总是不变的,因此可以自后向前逆推:设公差为
,则
,所以将
变成
所需的步数为
。
提示:此题必须开 long long!
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while(t--) {
long long n, a[100005], f[100005], ans = 0;
f[0] = 0;
cin >> n;
for(long long i = 1 ; i <= n ; i++) {
cin >> a[i];
f[i] = f[i-1] + a[i];
}
if(f[n]%n != 0) {
cout << -1 << endl;
}
else {
long long g = f[n]/n;
for (long long i = n; i > 0; i--) {
ans += abs(i * g - f[i]);
}
cout << ans << endl;
}
}
return 0;
} 
京公网安备 11010502036488号