题目描述
给一个长度为n的正整数序列{a1,a2,…,an},每次操作可以选择两个相邻的位
置,让一个元素-1另一个元素+1,输出最少几次操作,能让所有元素相等,
如果不可能实现,请输出"-1",不含引号。
输入
第一行一个整数T(T≤20),表示T组数据。
每组数据第一行一个整数n,第二行n个数字表示a序列,1≤a[i]≤100000
输出
对于每组数据,输出一个整数表示答案
样例输入
3
3
1 3 2
3
2 2 3
5
1 2 3 1 3
样例输出
1
-1
3
提示
保证T≤20
*10%的测试数据,1≤n≤5
*20%的测试数据1≤n≤100
*50%的测试数据,1≤n≤103
*80%的测试数据,1≤n≤104
*100%的测试数据,1≤n≤105
要想让所有元素相等,操作最少的方法就是把每个数都变成平均值
最后一个数要特殊判断一下,看看是不是平均值,如果不是就输出-1
AC代码
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
vector<ll> arr;
ll t,n,avg,cnt;
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while(t--)
{
cin >> n;
avg = 0;
for(ll i = 0; i < n; i++)
{
ll tmp;
cin >> tmp;
avg += tmp;
arr.push_back(tmp);
}
avg /= n;
cnt = 0;
for(int i = 0; i < n-1; i++)
{
if(arr[i] > avg)
{
cnt += arr[i]-avg;
arr[i+1] += arr[i]-avg;
arr[i] = avg;
}
else if(arr[i] < avg)
{
cnt += avg-arr[i];
arr[i+1] -= avg-arr[i];
arr[i] = avg;
}
}
if(arr[n-1] != avg)
cout << "-1" << endl;
else
cout << cnt << endl;
arr.clear();
}
return 0;
}