HDU 1205吃糖果(抽屉原理还能这么用)

先放题目:

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


        
  
Please use function scanf


这道题我苦思冥想,也没想到用到抽屉这个模型。

抽屉原理,也称鸽巢原理:

给n个抽屉 往里面放n+1个苹果 ,那么至少有一个抽屉放了两个苹果,扩展一下 放k*n+1个苹果那么至少有一个抽屉放了K+1个苹果(在现实中有挺大的用处)


但是我再一想,好像用到了抽屉这个模型,并没有用到抽屉原理,,ԾㅂԾ,,  下面看推导


设在n种糖果中,最多数量的糖果个数为MM ,所以其他种类的糖果数量一定小于等于MM

设其他n-1种糖果总个数为sum  有MM个抽屉并放在一起,先将那MM个糖果放过放进去,再放剩下的sum个糖果

假设从右到左一个一个放糖果,直至每个这排抽屉都放过完再从右往左放,放的过程中每个抽屉里的糖果都不会重样。



1.如果每个抽屉的糖果都大于等于2个 那么在吃糖果时一定不会重样,

因为每个抽屉吃完后都已经确认出吃的最后一个糖果是那种,然后吃下一个抽屉的糖果时因为有多种糖果,肯定能选一种方法再将这一抽屉的糖果吃完,以此类推。所以糖果肯定能吃完。


2.如果只有一个抽屉有一个MM糖果,其他的糖果都大于等于2,也可以吃完(只要选第一个吃的糖果不是MM就可以吃完) 


那么上面的情况之外情况:两个或者两个以上的抽屉只有一个MM糖果(其他抽屉理所当然的有两个糖果),

这种情况可以吃掉吗? 答案是不能

假设有剩下有两个抽屉都只有一个糖果 那么看图


当吃过只有一个糖果抽屉里的糖果时,若吃下一个有两个糖果的抽屉的糖果时,最后吃的一定还是这个MM糖果

所以每次最后的都是MM糖果就导致剩下一个抽屉(只有MM糖果的抽屉)不能被吃掉。 故不能(我也想不到更好的方法去吃糖果了O(∩_∩)O)


故在输入数据中 只要sum>=MM-1 就一定能吃完所有的糖果。


#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#define N 1000000
#define wc 1e-6
#define MOD 10
using namespace std;
//int candy[N+100];
int main()
{
    int t,n,maxx=0,mod;
    long long sum;
    scanf("%d",&t);
    while(t--)
    {
        sum=0;
        maxx=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&mod);
            sum+=mod;
            if(mod>maxx)
                maxx=mod;
        }
        sum=sum-maxx;
        if(sum+1>=maxx)
            printf("Yes\n");
        else
            printf("No\n");
    }
}


一个好的模型可以能让一个问题变得非常容易。



posted @ 2018-01-10 20:17  _年少有为  阅读(278)  评论(0编辑  收藏  举报