错排详解及案例
錯排詳解及案例
文章目錄
- 錯排詳解及案例
- 一、錯排詳解
- 二、案例
- 1.年會抽獎
- 2.三國佚事——巴蜀之危
一、錯排詳解
問題:現有10本書按照順序擺放,現要求重新排列,使得新的書的順序中每一本書都不在原來的位置,求有多少種排列方式?
- 這個問題推廣一下,就是錯排問題,是組合數學中的問題之一。
- 考慮一個有n個元素的排列,若一個排列中所有的元素都不在自己原來的位置上,那么這樣的排列就稱為原排列的一個錯排。 n個元素的錯排數記為D(n)。 研究一個排列錯排個數的問題,叫做錯排問題或稱為更列問題
- OK,現在詳細分析這個問題,我們要的最終結果就是書的編號與所在位置的編號都不相同,在這里,我們把n本書的錯排操作數記為D(n),那n-1本就是D(n-1),n-2本就是D(n-2)啦,下面,我們把放置問題分為兩步(初始位置號與書的編號相同):
- 第一步:
- 我們取一本書,書的編號為m,現在這本書就在我們手中,注意,按照題目要求,最開始的時候這本書的位置號也是m號,按照題目要求,我們現在放書時不能放回這個位置m了,而是要選擇其他位置,那么有多少種選擇呢
- 想一下,總共有n本書,n個位置,現在我手里這本書不能把它放到位置m,那么剩下的n-1個位置我當然就是隨便扔啦,也就是n-1種扔法
- 好,現在,我選擇了位置k,我決定把手里這本書放到位置k這里,記住這個是位置編號k,那么,我肯定要把原來這里的編號為k的書拿出來,再把這本編號為n的書放進去嘍。所以,現在我們手里的書的編號是k,我們需要對編號為k的書進行討論:
- 第二步:
- 我們把手里這本編號為k的書本放到書架,注意,放的過程中我們又面臨兩種情況:
- 可以想到,此時此刻現在書架上編號m的位置是空著的,所以我們可以選擇放在這個位置上,書的編號為k,位置編號為m,沒錯,滿足題意,這是第一種情況
- 還有一種就是我不選擇這個空著的位置m,我再重新選擇一個新的位置,我們稱之為第二種情況。下面詳細分析:
- 第一種情況:
- 我把這本編號為k的書放到這個編號為m的地址,那現在我們面前是什么狀況呢,就是位置k和位置m的書交換位置,也就是位置號不等于書號,即滿足錯排
- 總共n個位置,我們只動了m和k這兩個位置,那么剩下的n-2個位置還是紋絲不動,保持一一對應的關系
- 那么對于剩下的這n-2本書的錯排操作,我們又回到了問題的起點,求n-2本的錯排操作數D(n-2),結合第一步,我們可以得到第一種情況總共有(n-1)*D(n-2)種方法
- 第二種情況:
- 我們不選擇這個空著的位置m啦,我們手持這本編號為k的書,我們從除了位置m以及位置k的剩下的n-2個位置中選擇一個位置
- OK,我們現在開始想,我手里這本書不能放在這個位置m,嗯嗯,除了第一步我們放置的那本書m不用管了,我們還要把手里這本和剩下的n-2本,也就是n-1本,同時又要求手里這本k還不能放到位置m,這是不是就相當于把手里這本加上剩下的n-2本也就是n-1本書進行錯排呢
- 哇哇哇,想一想,錯排的定義,要求每本書都不能呆在某一個特定位置,是不是剛好符合呢qwq,所以,現在的問題就到了求手里這本和剩下的n-2本總共是n-1本書的錯排操作數,我們記為D(n-1),結合第一步,我們得出這第二種情況共有(n-1)*D(n-1)種方法
- 好的,現在我們總結兩種情況,結果進行相加,就可以得到遞推公式啦!遞推公式為:D(n)=(n-1)*[D(n-1)+D(n-2)]
二、案例
1.年會抽獎
- 問題描述
今年公司年會的獎品特別給力,但獲獎的規矩卻很奇葩:
現在告訴你參加晚會的人數,請你計算有多少概率會出現無人獲獎?
輸入描述
輸入包含多組數據,每組數據包含一個正整數n(2≤n≤20)。輸出描述
對應每一組數據,以“xx.xx%”的格式輸出發生無人獲獎的概率。示例1
輸入 2輸出 50.00%- 代碼
2.三國佚事——巴蜀之危
- 問題描述
話說天下大勢,分久必合,合久必分。。。卻道那魏蜀吳三國鼎力之時,多少英雄豪杰以熱血譜寫那千古之絕唱。古人誠不我欺,確是應了那句“一將功成萬骨枯”。
是夜,明月高懸。諸葛丞相輕搖羽扇,一臉愁苦。原來是日前蜀國戰事吃緊,丞相徹夜未眠,奮筆急書,于每個烽火臺寫下安排書信。可想,這戰事多變,丞相運籌 帷幄,給諸多烽火臺定下不同計策,卻也實屬不易。
誰成想這送信小廝竟投靠曹操,給諸葛丞相暗中使壞。這小廝將每封書信都投錯了烽火臺,居然沒有一封是對的。不多時小廝便被抓住,前后之事卻也明朗。這可急壞了諸葛丞相,這書信傳錯,勢必會讓蜀軍自亂陣腳,不攻自破啊! 諸葛丞相現在想知道被這小廝一亂,這書信傳錯共有多少種情況。
Input
題目有多組數據,處理到文件結尾,丞相共寫了n(1 <= n <= 20)封書信,輸入一個正數n。Output
輸出書信傳錯的情況數。 Sample Input1 3 6 Sample Output0 2 265 #include <stdio.h> typedef long long LL;LL f[50] ; int main() {f[0] = 0 ;f[1] = 0 ;f[2] = 1 ;int n ;for(int i = 3 ;i<= 20 ; i++){f[i] = (i - 1) * (f[i - 1] + f[i - 2]) ;}while(~scanf("%d",&n)){printf("%lld\n",f[n]);}return 0 ; }總結
- 上一篇: HTTP1.0、HTTP1.1和HTTP
- 下一篇: 给你一个能生成1到5随机数的函数,用它写