一、問題描述:
小張五一回家,父母給他安排了很多個相親的姑娘,設姑娘的人數爲N。
父親負責安排約會,每次隨機選擇一個要相親的對象, 母親負責記錄哪些姑娘已經約會過了。直到和所有的姑娘都約會完一遍以後,相親纔會結束。
這些天父母在吵架, 他們之間不會有任何言語溝通。所以父親不知道那些姑娘已經約會過了。因此下次約會的對象很可能是以前已經約會過的。
請問,如果小張要把所有的姑娘都約會一遍, 那麼平均需要約會多少個姑娘。
二、要求
輸入:
共1行,給出N的值,正整數。輸出:
共一行,即平均約會次數,保留4位小數。輸入範例:
100輸出範例:
512.0000
三、解決
編程語言: java
思路:
N個女孩,序號爲1~N,建立一個長度爲N的數組,代表女孩的約會狀態,0代表未和小張約過會,1代表已和小張約過會,將數組元素的初始值設爲0。
設置一個變量記錄約會次數。
每次隨機生成一個1~N之間的數m,代表即將和序號爲m的女孩約會,然後將該女孩的約會狀態由0設爲1;
然後對所有女孩的狀態屬性進行求和操作,若和爲N,說明,小張已經和所有女孩約過會了,記下此時的約會次數。對上述操作循環100次,然後根據每次循環下小張的約會次數,求取均值,即看作題目的答案。
package test;
import java.awt.Point;
import java.io.*;
import java.util.Scanner;
public class DateWithGirls {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
//用來接受控制檯輸入的女孩個數N
int N=0;
while(scanner.hasNext()){
N = scanner.nextInt();
int[] statusOfGirls= new int[N];
//設置實驗次數.
int times = 100;
//這個數組存儲每次實驗記錄的約會次數
int[] allCount = new int[times];
//開始實驗
for(int t=0;t<times;t++){
int count = 0;//計算約會次數
int sum = 0;//對所有女孩的約會狀態進行求和
//設置女孩初始約會狀態爲0.
for(int k=0;k<m;k++){
statusOfGirls[k] = 0;
}
boolean isContinue = true;
while(isContinue){
sum = 0;
//隨機生成要約會的女孩.
int ss = (int)Math.floor(Math.random()*m);
count+=1;//約會次數加1
//設置該女孩的約會狀態爲1.
statusOfGirls[ss] = 1;
//加總女孩的約會狀態.
for(int j=0;j<m;j++){
sum+=statusOfGirls[j];
}
if(sum==m){
//如果所有女孩的約會狀態都爲1則終止循環
isContinue = false;
}
//System.out.println(ss);
}
allCount[t] = count;//將約會次數存入數組
}
int totalCount=0;
for(int j=0;j<times;j++){
totalCount+=allCount[j];
}
double meanCount = totalCount/times;
System.out.printf("%.4f",meanCount);//格式化輸出.
}
}
}