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; }