hdu 1205 吃糖果(抽屉原理)

本文介绍了一道编程题目,任务是确定是否能通过特定顺序消耗不同类型的糖果,使得每次不会连续吃相同的糖果。通过寻找糖果数量的最大值,并判断是否能合理分配其他糖果到相应的“抽屉”中来解决该问题。

吃糖果

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 24390    Accepted Submission(s): 6969


Problem Description
HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。
 

Input
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。
 

Output
对于每组数据,输出一行,包含一个"Yes"或者"No"。
 

Sample Input
2 3 4 1 1 5 5 4 3 2 1
 

Sample Output
No Yes
Hint
Hint
Please use function scanf
 


题意就是  给出n种糖果的个数  吃糖果  要求是 同一种糖果不能同时吃

可以找出这些糖果中个数最多的种类   最多的个数记为an  

模拟为有an个抽屉 把其他n-1种类的糖果往这an个抽屉中放 因为an是最大的  所以同一个抽屉中可以不出现同一种类的糖果   所以只要保证 这an个抽屉中 最多有一个为空就可以

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>

#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  1000010
#define INF 0x7fffffff

#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define FOV(i,a,b)  for(int i=a;i>=b;i--)
#define REP(i,a,b)  for(int i=a;i<b;i++)
#define REV(i,a,b)  for(int i=a-1;i>=b;i--)
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll __int64

using namespace std;

ll a[MAXN];

int main()
{
//freopen("ceshi.txt","r",stdin);
    int tc;
    scanf("%d",&tc);
    while(tc--)
    {
        int n;
        scanf("%d",&n);
        ll sum=0;
        for(int i=0;i<n;i++)
        {
            scanf("%I64d",&a[i]);
            sum+=a[i];
        }
        sort(a,a+n);
        sum-=a[n-1];
        if(sum+1>=a[n-1])
            puts("Yes");
        else puts("No");
    }
    return 0;
}

  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值