程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [hdu-2048] 神、上帝以及老天爺

[hdu-2048] 神、上帝以及老天爺

編輯:C++入門知識

神、上帝以及老天爺

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20794 Accepted Submission(s): 8780

Problem Description HDU 2006'10 ACM contest的頒獎晚會隆重開始了!
為了活躍氣氛,組織者舉行了一個別開生面、獎品豐厚的抽獎活動,這個活動的具體要求是這樣的:

首先,所有參加晚會的人員都將一張寫有自己名字的字條放入抽獎箱中;
然後,待所有字條加入完畢,每人從箱中取一個字條;
最後,如果取得的字條上寫的就是自己的名字,那麼“恭喜你,中獎了!”

大家可以想象一下當時的氣氛之熱烈,畢竟中獎者的獎品是大家夢寐以求的Twins簽名照呀!不過,正如所有試圖設計的喜劇往往以悲劇結尾,這次抽獎活動最後竟然沒有一個人中獎!

我的神、上帝以及老天爺呀,怎麼會這樣呢?

不過,先不要激動,現在問題來了,你能計算一下發生這種情況的概率嗎?

不會算?難道你也想以悲劇結尾?!

Input 輸入數據的第一行是一個整數C,表示測試實例的個數,然後是C 行數據,每行包含一個整數n(1

Output 對於每個測試實例,請輸出發生這種情況的百分比,每個實例的輸出占一行, 結果保留兩位小數(四捨五入),具體格式請參照sample output。


Sample Input
1
2

Sample Output
50.00%

分析:這是一道遞推題

1、n 個人 n 張票,就有 n! 種排列情況。我們需要做的就是從這 n! 種情況中,找出 n 個人所有的錯排情況。

2、假設有 n 個人,錯排情況數是 f ( n ) ,把他們分成 1 個人和 n - 1 個人兩部分。有如下 3、4 兩種情況:

3、假設 1 個人拿的是自己的票, n - 1 拿的都不是自己的票,那麼這 1 個人只需要和這 n - 1 個人中任何一個人交換一下票,就可滿足 n 個人錯排。所以有 ( n - 1 ) * f ( n - 1 ) 。

4、假設 n - 1 個人其中有一個人拿的是自己的票,1 個人拿的不管是不是自己的票,只要和 n - 1 個人當中那個拿自己票的人交換一下,就可滿足 n 個人錯排。而且,n - 1 個人當中除掉拿自己票的人,n - 2 個人肯定滿足錯排。所以又有 ( n - 1 ) * f ( n - 2 ) 。

綜上所述:f ( n ) = ( n - 1) * [ f ( n - 1 ) + f ( n - 2 ) ]

寫程序時,可以利用一個二維數組cases [ 21 ] [ 2 ] ,數組第 0 列存儲 n 個人的所有排列情況 n! ,數組第 1 列存儲 n 個人的錯排情況 f ( n ) = ( n - 1) * [ f ( n - 1 ) + f ( n - 2 ) ]

import java.util.Scanner;

public class Main {

	static long[][] cases = new long[21][2];

	static {
		cases[1][0] = 1;
		cases[1][1] = 0;
		cases[2][0] = 2;
		cases[2][1] = 1;

		for (int i = 3; i < 21; i++) {
			cases[i][0] = i * cases[i - 1][0];
			cases[i][1] = (i - 1) * (cases[i - 1][1] + cases[i - 2][1]);
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();

		while (n-- != 0) {
			int count = scanner.nextInt();

			System.out.printf("%.2f", 100.0 * cases[count][1] / cases[count][0]);
			System.out.println("%");
		}
	}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved