題目如下:
這道題就是對錯排的深入理解了
首先新郎與新娘不配對的條件就是該新郎與另一新娘配對,造成這兩隊的人馬均發生錯排,由此可以判斷出應該與錯排有關。
題目中中的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,那麼,...