• 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
    ");
            else
                printf("No
    ");
        }
    }


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



  • 相关阅读:
    Ubuntu安装最新版的nodejs
    Mac安装并破解OmniGraffle7
    Mac安装并破解StarUML
    Windows10使用Chocolatey安装mysql之后无法使用的解决办法
    Visual Studio编辑类模板的位置
    VS2017连接到中国区的Azure
    Windows上包管理器之Chocolatey初体验
    CENTOS7.3 64位架设使用MYSQL数据库的ASP.NET CORE网站
    从无到有开发自己的Wordpress博客主题---主页模板
    c# 获得方法的所属类(或调用者)的类名,方法名
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/9780091.html
Copyright © 2020-2023  润新知