hrbust 1648 Tailmon与序列【贪心】

探讨如何通过特定操作使序列中的数字尽可能多地变为同一个数值。解析题目关键点,给出解题思路及AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tailmon与序列
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 38(27 users)Total Accepted: 29(27 users)Rating: Special Judge: No
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);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值