1. 程式人生 > >hdu 1205 :吃糖果

hdu 1205 :吃糖果

鴿巢原理

1.把某種糖果看做隔板,如果某種糖果有n個,那麼就有n+1塊區域,至少需要n-1塊其他種糖果才能使得所有隔板不挨在一塊..也就是說能吃完這種糖果.至少需要其他種類糖果n-1塊..(鴿巢原理)

2.數量最多的糖果(隔板)可以構造最多的空間,如果這種糖果有maxn個....那麼需要maxn-1個其他種糖果.對於某種數量少於maxn的糖果來說,可以在原本數量最多的糖果構造的隔板上"加厚"原有的隔板...,那麼這"某種糖果"就銷聲匿跡了.....

考慮極端情況.如果某種糖果無法在這maxn+1的空間內構造出符合條件的序列,那麼這種糖果至少要有maxn+1+1個(考慮只有兩種糖果的情況)...(鴿巢原理)...但是這與數量最多的那種糖果只有maxn個矛盾.....(maxn+1+1>maxn 這不等式不難理解吧....).

題意:要求吃糖果不能連續吃同一種類型的糖果,給出各類糖果的總數,問是否能夠吃完所有的糖果,如果違反規則就表示吃不完。

題解:網上看到的方法,把最多一類的糖果當成隔板,這樣然後剩餘的糖果貼上去就相當於是在給這個隔板加厚,這樣就利用這個隔板模型將不連續吃同一類糖果的問題相

對應起來了,然後我們來看看這個模型是否成立,成立的條件其實是隔板是否會連續出現,即隔板沒有剩餘(即除最大數量糖果型別的其他型別糖果)的糖果可以放置,那麼

可能會問會不會其他型別的兩個糖果連續在一起呢(這裡想了很久,其實關鍵注意隔板的存在就行了),這是不可能出現的問題,因為有隔板的存在,它總是起著一個隔離相同型別糖果的作用,並且這個隔板是數量最多的一類糖果,如果把數量第二大的型別的糖果用來加厚,要想第二大數量的連續在一起,只能是第二大數量的糖果數量>第一大數量的糖果(即隔板),顯然這是不可能的,也就是說用來加厚的同種型別糖果不會迴圈超過隔板一週,以此類推再用第三大數量的糖果繼續加厚,也不會出現連續,那麼可能唯一連續的就是隔板;這樣我們把最大數量型別的糖果分為一類 其數量為max,其他型別的糖果分為一類 其數量為c,如果max-c>=2  說明是肯定存在連續的隔板相鄰在一起的


所以就吃不完糖果,否則就能吃完,不用去管它具體如何吃的策略;這就是典型的透過具體過程,從結果來論證的數學方法。

 根據網上的思路,把最大的數目的糖果數當作盒子數,用來劃分不同種類的糖果,然後每種糖果依次放到每一個盒子裡,根據鴿巢原理,如果空盒子數大於等於2,那麼就是No

第一抽屜原理
原理1: 把多於n+1個的物體放到n個抽屜裡,則至少有一個抽屜裡的東西不少於兩件。
證明(反證法):如果每個抽屜至多隻能放進一個物體,那麼物體的總數至多是n,而不是題設的n+k(k≥1),故不可能。
原理2 :把多於mn(m乘以n)個的物體放到n個抽屜裡,則至少有一個抽屜裡有不少於(m+1)的物體。
證明(反證法):若每個抽屜至多放進m個物體,那麼n個抽屜至多放進mn個物體,與題設不符,故不可能。

原理3 :把無窮多件物體放入n個抽屜,則至少有一個抽屜裡 有無窮個物體。
原理1 、2 、3都是第一抽屜原理的表述。
第二抽屜原理
把(mn-1)個物體放入n個抽屜中,其中必有一個抽屜中至多有(m—1)個物體(例如,將3×5-1=14個物體放入5個抽屜中,則必定有一個抽屜中的物體數少於等於3-1=2)。
證明(反證法):若每個抽屜都有不少於m個物體,則總共至少有mn個物體,與題設矛盾,故不可能。

#include<stdio.h>
__int64 sum = 0;
int main(){
    int t = 0;
    int max_sweet = 0;
    scanf("%d",&t);
    while(t--){
        int n = 0,m= 0,i = 0;
        max_sweet = sum = 0;
        scanf("%d",&n);
        for(i =0;i<n;i++){
            scanf("%d",&m);
            if(max_sweet<m){
                max_sweet = m;
            }
            sum += m;
        }
        if(sum-max_sweet+1>=max_sweet){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }
    return 0;
}


吃糖果

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


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 HintHint Please use function scanf
Author Gardon