Change
1s,256M
【题目描述】
给你一个含n个整数的序列A,每次你可以对这个序列做如下操作:
1)选择2个元素ai,aj(i!=j)
2)改变这2个元素的值,也就是ai=ai+1aj=aj-1
你可以对这个序列进行任意次操作,问你最多能得到多少个相同的数?
【输入格式】
第一行n
第二行n个数,为序列A
【输出格式】
一个数为最多能得到相同数的个数
【输入输出样例】
Input1
2 2 1
Output1
1
Input2
3 1 4 1
Output2
3
【数据约定】
100%数据:n<=10^5, |ai|<=10^4
【解法】
第一眼看到题,什么来的,线段数维护区间?后面想想无论怎么操作所有数字的和不变;
所以所有的和是n的倍数答案就是n(刚好平均分配)
如果不是n的倍数答案就是n-1(牺牲一个数,把其他数都变得一样大)
【代码】
#include<cstdio> #include<cstdlib> #include<iostream> #include<iomanip> using namespace std; int i,j,k,m,n,o,p,js,jl,mm; int main() { FILE *fin,*fout; fin=fopen("change.in","rb"); fout=fopen("change.out","wb"); fscanf(fin,"%d",&n); js=0; for(i=1;i<=n;i++) { fscanf(fin,"%d",&jl); if(js>0)js=js+jl; else js=js+n-(0-jl)%n; } m=js%n; if(m==0)fprintf(fout,"%d",n); else fprintf(fout,"%d",n-1); fclose(fin); fclose(fout); return 0; }