今年暑假杭電acm集訓隊第一次組成女生隊,其中有一隊叫rpg,但做為集訓隊成員之一的野駱駝竟然不知道rpg三個人具體是誰誰。rpg給他機會讓他猜猜,第一次猜:r是公主,p是草兒,g是月野兔;第二次猜:r是草兒,p是月野兔,g是公主;第三次猜:r是草兒,p是公主,g是月野兔;......可憐的野駱駝第六次終於把rpg分清楚了。由於rpg的帶動,做acm的女生越來越多,我們的野駱駝想都知道她們,可現在有n多人,他要猜的次數可就多了,為了不為難野駱駝,女生們只要求他答對一半或以上就算過關,請問有多少組答案能使他順利過關。
輸入的資料裡有多個case,每個case包括乙個n,代表有幾個女生,(n<=25),n=0輸入結束。12
011根據題目描述可知需要找到n個女生當中能夠猜對一半或以上人數的名字,才能夠過關。所以可以等同於看成在n個女生當中,有小於或等於一半的人數的真實名字與猜測名字不符合的錯排問題。
對於錯排問題,假設有n個人,每個人按進行編號,然後進行排隊。則n個人錯排表示這n個人編號與所站的位置不同。設f(n)為n個人錯排的情況總數。考慮下面兩種情況:
1. n-1個人錯排,1個人編號和所佔的位置相同,要使得能夠達到n個人錯排,只需要剩下的1個人與n-1個人中的某個人交換位置即可。則該種情況的總數為f(n-1)*(n-1)。
2. n-1個人中有1個人編號和位置相同,其餘的n-2個人錯排,而剩下的1個人編號和所佔位置不同,要使得能夠達到n個人錯排,只需要n-1中那個編號與位置相同的人與剩下的1個人交換位置即可。則該種情況的總數為f(n-2)*(n-1)。
所以 f(n) = (n-1)*(n-1) + f(n-1)*(n-2)。
對於n中人有m人錯排的問題,則等同於從n個人中選取m個人,然後這m個人錯排,其餘n-m個人未錯排,則情況的總數為
對於該問題,n個人中有小於或等於一半的人數錯排等同於0、1、2、3、…、n/2個人錯排情況的總和。
#includeusing namespace std;
long long c(int n,int m)
^" class="mathcode" src=""/>的函式,如果先分別算出分子、分母,然後再相除,需要考慮在相乘時,分子和分母是否會溢位。如果是先相除後再相乘,需要考慮在相除的時候會不會出現算出整數結果、精度丟失而導致結果錯誤的問題。
1.long long c(int n,int m)
return a/b;
}
2.
long long c(int n,int m)
return res;
}
hdu 2068 RPG的錯排(組合)
hdu 2068 rpg的錯排 description 今年暑假杭電acm集訓隊第一次組成女生隊,其中有一隊叫rpg,但做為集訓隊成員之一的野駱駝竟然不知道rpg三個人具體是誰誰。rpg給他機會讓他猜猜,第一次猜 r是公主,p是草兒,g是月野兔 第二次猜 r是草兒,p是月野兔,g是公主 第三次猜 r...
hdu 2068 RPG的錯排 錯排)
problem description 今年暑假杭電acm集訓隊第一次組成女生隊,其中有一隊叫rpg,但做為集訓隊成員之一的野駱駝竟然不知道rpg三個人具體是誰誰。rpg給他機會讓他猜猜,第一次猜 r是公主,p是草兒,g是月野兔 第二次猜 r是草兒,p是月野兔,g是公主 第三次猜 r是草兒,p是公主...
HDU 2068 RPG錯排 錯排公式
1.題意 1到n的序列的排列中,元素位置與元素值相對應的情況 值為i的元素在某個排列中正好排在第i個位置 大於等於序列規模一半的情況,有多少個?2.輸入輸出 每組資料乙個數,n,規定輸入以0結尾 3.分析 原題意換句話說,就是針對1到n的全排列,錯排元素的個數小於等於n的情況有多少 那麼,輸出即為 ...