1. 程式人生 > >51Nod - 1639 綁鞋帶

51Nod - 1639 綁鞋帶

cnblogs 單獨 turn tdi namespace std ref 輸出 pac

51Nod - 1639 綁鞋帶

有n根鞋帶混在一起,現在重復n次以下操作:隨機抽出兩個鞋帶頭,把它們綁在一起。可以想象,這n次之後將不再有單獨的鞋帶頭,n條鞋帶系成了一些環。那麽有多大概率剛好所有這些鞋帶只形成了一個環? Input
僅一行,包含一個整數n  (2<=n<=1000)。
Output
輸出一行,為剛好成環的概率。
Input示例
2
Output示例
0.666667

題解:

  參考1: https://www.51nod.com/question/index.html#!questionId=1415

  參考2: http://www.cnblogs.com/geek1116/p/6282878.html

  看上去是很復雜的題目。 但是使用遞推的方法就簡單多了。

  對於 f[i-1] 來說, f[i] 的成功情況是, 抓住一個鞋帶透, 只要剩下的 2*i - 1 中有 2*i 能組成一個環, 則這個頭連接上不取的那個,就可以成功匹配。

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
using namespace std;  

int main(){
	freopen("in.txt", "r", stdin); 

	double ans; 
	int n, cnt; 
	while(scanf("%d", &n) != EOF){
		ans = 1.0; 
		cnt = 2; 
		for(int i=1; i<n; ++i){
			ans = ans*( cnt*1.0 / (cnt + 1) ); 
			cnt = cnt + 2; 
		}
		printf("%.6f\n", ans ); 
	}
	return 0; 
}

  

51Nod - 1639 綁鞋帶