close

題目概要:

計算出獲勝者的機率。

 

解題方向:

第一個輸入:有多少組測試資料。

第二個輸入:參加遊戲人數。

第三個輸入:獲勝的機率。

第四個輸入:第幾個人獲勝。

 

※假設獲勝機率: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));
}
}
}
}
view raw uva10056.java hosted with ❤ by GitHub

arrow
arrow
    文章標籤
    Java
    全站熱搜
    創作者介紹
    創作者 a7069810 的頭像
    a7069810

    紀錄自己的程式人生

    a7069810 發表在 痞客邦 留言(1) 人氣()