HDU 2049 對錯排的深入理解)

2021-09-29 16:21:11 字數 1519 閱讀 4549

題目如下:

這道題就是對錯排的深入理解了

首先新郎與新娘不配對的條件就是該新郎與另一新娘配對,造成這兩隊的人馬均發生錯排,由此可以判斷出應該與錯排有關。

題目中中的m個新郎找錯新娘其實就是有m對人發生了錯排。

由此有兩種情況:

(1)當第n個新郎前面的n-1個新郎均找錯了,但是第n個新郎找對了,則可以讓他與 前面的n-1個新郎隨機找乙個出來交換新娘就可以達到n個新郎全部找錯。這種情況下的方法位f(n-1)*(n-1)。

(2)前面n-1個新郎並不是全都找錯了新娘,且第n個新郎找對了新娘,要「犧牲」這弟n個新郎的正確性,來換取n個新郎全部找錯的情況,則必須滿足兩個條件,1前面只有乙個新郎找對,2最後乙個找對的新郎與該正確新郎進行對調就可以達到n個全部錯位的情況。因為前面有乙個是對的則錯排的情況只有f(n-2)種,但是前面的n-1個新郎都有可能找對新娘,則還要乘上乙個n-1才可以。

綜上所述可以的出遞推關係:

f(n)=(n-1) * (f(n-1) + f(n-2))

但是還沒結束,因為是n個新郎中找出m個,則還要乘以c(n,m)的組合數來找到那m個倒霉的新郎

最終的結果就為:

f(n)*c(n,m)

其中求組合數的函式有點坑:

long

long

intc

(long

long n,

long

long m)

long

long a,b,c;

a=muti

(n);b=

muti

(m);c=

muti

(n-m)

;return a/c/b;

}

最後附上ac的**:

#include

long

long

intmuti

(long

long

int n)

return n;

}long

long

intc

(long

long n,

long

long m)

long

long a,b,c;

a=muti

(n);b=

muti

(m);c=

muti

(n-m)

;return a/c/b;

}int

main

(void

)int n;

scanf

("%d"

,&n)

;for

(int i=

0;i)}

HDU 2049 錯排變種

不容易系列之 4 考新郎 problem description 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己...

HDU 2049 考新郎(錯排)

國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開蓋頭,如果...

錯排 HDU 2049 遞推的應用

當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用m n 表示,那麼m n 1 就表示n 1個編號元素放在n 1個編號位置,各不對應的方法數,其它類推.第一步,把第n個元素放在乙個位置,比如位置k,一共有n 1種方法 第二步,放編號為k的元素,這時有兩種情況 把它放到位置n,那麼,...