題目:
hdu 2006』10 acm contest的頒獎晚會隆重開始了!
為了活躍氣氛,組織者舉行了乙個別開生面、獎品豐厚的**活動,這個活動的具體要求是這樣的:
首先,所有參加晚會的人員都將一張寫有自己名字的字條放入**箱中;
然後,待所有字條加入完畢,每人從箱中取乙個字條;
最後,如果取得的字條上寫的就是自己的名字,那麼「恭喜你,中獎了!」
大家可以想象一下當時的氣氛之熱烈,畢竟中獎者的獎品是大家夢寐以求的twins簽名照呀!不過,正如所有試圖設計的喜劇往往以悲劇結尾,這次**活動最後竟然沒有乙個人中獎!
我的神、上帝以及老天爺呀,怎麼會這樣呢?
不過,先不要激動,現在問題來了,你能計算一下發生這種情況的概率嗎?
不會算?難道你也想以悲劇結尾?!
input
輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c 行資料,每行包含乙個整數n(1output
對於每個測試例項,請輸出發生這種情況的百分比,每個例項的輸出佔一行, 結果保留兩位小數(四捨五入),具體格式請參照sample output。
sample input12
sample output
50.00%
#include using namespace std;
#define n 30
long long num[n]; //num代表錯排列的個數
//打表
void arrangement()
}int main()
printf("%.2lf",(num[m] / sum) * 100);
printf("%%\n");
}return 0;
}
這道題想了好久,才ac了。這個問題推廣一下,就是錯排問題,是組合數學中的問題之一。本題要求計算錯排的概率,其實就是算出所有錯排的方式除以全排列的方式。先來看全排列的方式,這個比較容易想到,如果要計算n個人全排列的方式那就是n!(因為對於第乙個人他有n種選擇,第二個人有n - 1種選擇,以此類推,那麼對於第n個人來說就只有唯一一種選擇了,所以n個人全排列方式就是n * n-1 * n - 2 * …*1也就是n!)。再來計算所有錯排的方式,假如a[n - 1]和a[n - 2]分別代表的是n - 1個人的錯排列方式和n-2個人的錯排列方式。現在要在n - 1個人中再加入乙個人x,如果加入進這個數之後要形成錯排列,那麼對於x這個人來說就有n - 1種方式(因為只要不拿自己的名字就可以了),假設在n-1個人中x拿了y的名字,那麼此時的y要麼拿了x的名字,那麼沒拿x的名字。如果y拿了x的名字,那麼剩下的n - 2個人錯排列就可以了,所以此時錯排列的總數為(i-1)*a[n - 2]。如果y沒拿x的名字,那麼剩下n - 1個人錯排列就可以了,此時的錯排列總數就是(i - 1)*a[n - 1].兩種情況合起來就是a[n] =(i-1)*a[n - 2] + (i - 1)*a[n - 1]。
知道這個之後計算概率就變得簡單了,注意這裡的全排列數要開long long 型的否則會wa。
HDU 2048 神 上帝以及老天爺
problem description hdu 2006 10 acm contest的頒獎晚會隆重開始了!為了活躍氣氛,組織者舉行了乙個別開生面 獎品豐厚的 活動,這個活動的具體要求是這樣的 首先,所有參加晚會的人員都將一張寫有自己名字的字條放入 箱中 然後,待所有字條加入完畢,每人從箱中取乙個字...
HDU2048 神 上帝以及老天爺
include include int main return 0 錯排問題。當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用d n 表示,那麼d n 1 就表示n 1個編號元素放在n 1個編號位置,各不對應的方法數,其它類推.第一步,把第n個元素放在乙個位置,比如位置k,一共有...
HDU 2048 神 上帝以及老天爺
problem description hdu 2006 10 acm contest的頒獎晚會隆重開始了!為了活躍氣氛,組織者舉行了乙個別開生面 獎品豐厚的 活動,這個活動的具體要求是這樣的 首先,所有參加晚會的人員都將一張寫有自己名字的字條放入 箱中 然後,待所有字條加入完畢,每人從箱中取乙個字...