天天看點

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  說明是肯定存在連續的隔闆相鄰在一起的

hdu 1205 :吃糖果吃糖果

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

 根據網上的思路,把最大的數目的糖果數當作盒子數,用來劃分不同種類的糖果,然後每種糖果依次放到每一個盒子裡,根據鴿巢原理,如果空盒子數大于等于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


   
    
     Hint
    Hint
   
    
Please use function scanf
        

Author Gardon