Tailmon与序列 | ||||||
| ||||||
Description | ||||||
Tailmon正在研究一串序列,这个序列包含了n个整数。现在它正想着通过一定的操作使得这串序列变得有相同数字越多越好。而这个操作只能是如下的: 它会选定序列中的2个数ai,aj当然i!=j,然后它将ai増加1,将aj减少1,即ai=ai+1, aj=aj-1 以上的操作会改变该序列中的两个不同的元素,Tailmon可以进行上述操作无限次,只求将该序列中的数变成某一个数越多越好。现在他想知道通过上述操作无限多次,最多能得到多少个相同的数。 | ||||||
Input | ||||||
本题有多组测试数据。每组测试数据由2行组成。 第一行一个整数n(1<=n<=10^5),代表序列中元素个数。 第二行,包含n个由空格分隔的整数,这些整数都在(-10^4<=ai<=10^4)范围内。 | ||||||
Output | ||||||
对每组测试数据输出一行,该行包含一个整数代表通过上述操作后序列中相同大小的数最多有多少个。 | ||||||
Sample Input | ||||||
2 2 1 3 1 4 1 | ||||||
Sample Output | ||||||
1 3 | ||||||
Hint | ||||||
第一组中不可能通过増减操作让两个数相等。 第二组中可以变成2 2 2三个相等的数。 | ||||||
Author | ||||||
ZeroPointer@HRBUST |
思路:
纯正的贪心题,智商测验题...........................
很明显,我们要将所有数往平均数上均摊,如果所有数的和是平均数的倍数,那么一定能够均摊开来,那么答案就是n。
否则如果所有数的和不是平均数的倍数,那么一定均摊不起来。那么此时将n-1个数随意设定一个数值(比如0),使其相等(都是0当然相等了),然后令另外的那个数是任意值即可。那么此时答案就是n-1。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int sum=0;
for(int i=1;i<=n;i++)
{
int tmp;
scanf("%d",&tmp);
sum+=tmp;
}
if(sum%n==0)
{
printf("%d\n",n);
}
else printf("%d\n",n-1);
}
}