ACM学习历程—HDU2068 RPG的错排(组合数学)
生活随笔
收集整理的這篇文章主要介紹了
ACM学习历程—HDU2068 RPG的错排(组合数学)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
今年暑假杭電ACM集訓(xùn)隊第一次組成女生隊,其中有一隊叫RPG,但做為集訓(xùn)隊成員之一的野駱駝竟然不知道RPG三個人具體是誰誰。RPG給他機會讓他猜猜,第一次猜:R是公主,P是草兒,G是月野兔;第二次猜:R是草兒,P是月野兔,G是公主;第三次猜:R是草兒,P是公主,G是月野兔;......可憐的野駱駝第六次終于把RPG分清楚了。由于RPG的帶動,做ACM的女生越來越多,我們的野駱駝想都知道她們,可現(xiàn)在有N多人,他要猜的次數(shù)可就多了,為了不為難野駱駝,女生們只要求他答對一半或以上就算過關(guān),請問有多少組答案能使他順利過關(guān)。Input
輸入的數(shù)據(jù)里有多個case,每個case包括一個n,代表有幾個女生,(n<=25), n = 0輸入結(jié)束。Output
對應(yīng)每組數(shù)據(jù)輸出最小移動距離。Sample Input
1 2 0Sample Output
1 1?
假設(shè)i個人在他本來位置,其余人錯排的種數(shù)是f[i],那么題目要求的就是所有大于等于(n+1)/2的f[i]的和,n+1是為了對奇數(shù)偶數(shù)情況統(tǒng)一。
假設(shè)k個人錯排是p[k],
那么就是n個人先取出i個人在自己位置C(n, i),其余人再錯排p[n-i],然后控制i的范圍就OK了。
這里需要注意的是由于題目沒有模的情況,所以所有數(shù)可能會很大,所以在求p和c的時候最好是相鄰項間遞推。
?
代碼:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <set> #include <map> #include <queue> #include <string> #include <algorithm> #define LL long longusing namespace std;int n; LL p[30], c[30], ans;void init() {p[0] = 1;p[1] = 0;p[2] = 1;for (int i = 3; i < 30; ++i)p[i] = (i-1)*(p[i-1]+p[i-2]); }void cal() {c[0] = 1;for (int i = 1; i <= n; ++i)c[i] = c[i-1]*(n-i+1)/i; }void work() {ans = 0;int half = (n+1)/2;for (int i = 0; i+half <= n; ++i)ans += c[i+half]*p[n-i-half];printf("%I64d\n", ans); }int main() {//freopen("test.in", "r", stdin); init();while (scanf("%d", &n) != EOF && n){cal();work();}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/andyqsmart/p/4756598.html
總結(jié)
以上是生活随笔為你收集整理的ACM学习历程—HDU2068 RPG的错排(组合数学)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用手动和自动分别实现使用其DVD安装盘作
- 下一篇: 2016-1-31