先放題目:
hoho,終於從speakless手上贏走了所有的糖果,是gardon吃糖果時有個特殊的癖好,就是不喜歡將一樣的糖果放在一起吃,喜歡先吃一種,下一次吃另一種,這樣;可是gardon不知道是否存在一種吃糖果的順序使得他能把所有糖果都吃完?請你寫個程式幫忙計算一下。
input
第一行有乙個整數t,接下來t組資料,每組資料佔2行,第一行是乙個整數n(0
output
對於每組資料,輸出一行,包含乙個"yes"或者"no"。
sample input
2sample output34 1 1
55 4 3 2 1
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...