题目大意
给出一个序列,将它调整,使它最后元素相等,若做不到输出 $-1$,否则输出调整次数。
分析
因为要做到元素相同,所以将所有元素之和除去元素数量,就可以知道调整之后每个元素的大小,如果除不尽,就可以输出 $-1$ 了。
序列:$3,2,2,0,2,3$
不难发现我们需要调整两次即可完成目的,我们的目的是将糖果多的人的糖果分出去即可,所以我们直接计有多少人的糖果数多于平均糖果数即可。
注意:
对于下面的序列,答案为 $1$,因为只需要分配第一个糖果堆即可完成目的。
序列:$6,1,1,1,1$
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int t,n;//t组数据 n个元素
int a_a[200001];//存储糖果堆
long long sum;//所有元素的和
int n_n;//需调整的的糖果堆
int main(){
scanf("%d",&t);
while(t--){
sum=0;n_n=0;
memset(a_a,0,sizeof a_a);//多测清空
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a_a[i]),sum+=a_a[i];
if(sum%n!=0){
cout<<-1<<endl;//不能平均分配
continue;
}
sum/=n;//sum变为元素的平均值
for(int i=0;i<n;i++)
if(a_a[i]>sum)n_n++;
cout<<n_n<<endl;
}
return 0;
}