題目概要:
計算出獲勝者的機率。
解題方向:
第一個輸入:有多少組測試資料。
第二個輸入:參加遊戲人數。
第三個輸入:獲勝的機率。
第四個輸入:第幾個人獲勝。
※假設獲勝機率:p、輸機率:q=1-p,每次遊戲共有R個回合、有n個人參與遊戲、第k個人獲勝。
稍微列出計算式子。
Round_1:
第一個人獲勝的機率:p
第二個人獲勝的機率:q*p
第三個人獲勝的機率:(q^2)*p
第k個人獲勝的機率:(q^(k-1))*p
Round_2:
第一個人獲勝的機率:(q^n)*p
第二個人獲勝的機率:(q^n)*q*p
第三個人獲勝的機率:(q^n)*(q^2)*p
第k個人獲勝的機率:(q^n)*(q^(k-1))*p
Round_R:
第一個人獲勝的機率:(q^(R-1)*n)*p
第二個人獲勝的機率:(q^(R-1)*n)*q*p
第三個人獲勝的機率:(q^(R-1)*n)*(q^2)*p
第k個人獲勝的機率:(q^(R-1)*n)*(q^(k-1))*p
※使用等比級數整理每個回合獲勝的機率就可以獲得此公式:(q^(k-1)*p) * (1-(q^n^R)) / (1-q^n)。(首項:(q^(k-1)*p)、公比:q^n)
注意事項:
1.由於題目沒有說要進行多少回合的遊戲,所以R帶50即可。我有試過R=100,但是在Uva Online Judge會出現錯誤,可能是回合數太多,算出來的機率會更精準的關係。
2.在瘋狂程設中要輸出答案時使用printf輸出時,換行符號則要打\r\n。在Uva Online Judge使用printf輸出時,換行符號只需要打\n即可,多打會錯。
程式碼:
/* | |
*Java | |
*Author:SHEN,ZHI-XUN | |
*Time:2017/9/10 | |
*/ | |
import java.util.Scanner; | |
class main{ | |
public static void main(String ars[]){ | |
Scanner sc=new Scanner(System.in); | |
int cases=sc.nextInt(); | |
int R=50; | |
while((cases--)>0){ | |
int n=sc.nextInt(); | |
double p=sc.nextDouble(); | |
double q=1-p; | |
int k=sc.nextInt(); | |
double a=Math.pow(q,k-1)*p; | |
double r=Math.pow(q,n); | |
if(p==0){ | |
System.out.println("0.0000"); | |
}else{ | |
System.out.printf("%.4f\r\n",a*(1-Math.pow(r,R))/(1-r)); | |
} | |
} | |
} | |
} |