蒟蒻养成记——幼儿园数论(1)

xiaoxiao2021-02-28  62

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

转载请注明原文地址: https://www.6miu.com/read-55966.html

最新回复(0)