HDU 1205吃糖果 抽屜原理還能這麼用

2022-03-14 05:43:04 字數 1850 閱讀 7598

先放題目:

hoho,終於從speakless手上贏走了所有的糖果,是gardon吃糖果時有個特殊的癖好,就是不喜歡將一樣的糖果放在一起吃,喜歡先吃一種,下一次吃另一種,這樣;可是gardon不知道是否存在一種吃糖果的順序使得他能把所有糖果都吃完?請你寫個程式幫忙計算一下。

input

第一行有乙個整數t,接下來t組資料,每組資料佔2行,第一行是乙個整數n(0

output

對於每組資料,輸出一行,包含乙個"yes"或者"no"。

sample input

2

34 1 1

55 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#include#include#include#include#include#define n 1000000

#define wc 1e-6

#define mod 10

using namespace std;

//int candy[n+100];

int main()

sum=sum-maxx;

if(sum+1>=maxx)

printf("yes\n");

else

printf("no\n");}}

乙個好的模型可以能讓乙個問題變得非常容易。

吃糖果 HDU 1205 抽屜原理

hoho,終於從speakless手上贏走了所有的糖果,是gardon吃糖果時有個特殊的癖好,就是不喜歡將一樣的糖果放在一起吃,喜歡先吃一種,下一次吃另一種,這樣 可是gardon不知道是否存在一種吃糖果的順序使得他能把所有糖果都吃完?請你寫個程式幫忙計算一下。第一行有乙個整數t,接下來t組資料,每...

hdu 1205 吃糖果(抽屜原理)

題意 n種糖果,不能把一樣的放在一起吃,即第一次吃一種,下一次吃另一種。思路 找到個數最多的糖果種類 最大的數目記作 ma,該糖果種類記為a 首先把這n個糖果放到n個抽屜裡面,然後把剩餘的n 1種糖果往抽屜裡面放。因為n是最大的數目,即剩餘的n 1種糖果的放置過程中,每一種糖果都可以分別放到不同的抽...

hdu 1205 吃糖果 輸入掛 抽屜原理

有最多數量的某種糖果數量為maxn,接下來問題轉化成能否將在maxn個相同的糖果序列中間差入一些其他糖果,將相同的糖果分開。根據抽屜原理,最少需要maxn 1個糖果。include include include include include include include include inc...