CF1538B Friends and Candies


题目大意

传送门

给出一个序列,将它调整,使它最后元素相等,若做不到输出 $-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; 
}

文章作者: 王大神——A001
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王大神——A001 !
  目录