天天看點

藍橋試題 算法提高 抽卡遊戲 JAVA

資源限制

時間限制:1.0s 記憶體限制:256.0MB

  某個抽卡遊戲卡池抽出限定卡的機率為p,該遊戲有一個“井”的機制,抽滿k次卡後直接送這張限定卡。試求獲得這張限定卡需要的期望抽卡次數。輸入為一行,用空格隔開的p和k。輸出為一行,即期望抽卡次數,取2位小數

樣例輸入

0.005 250

樣例輸出

142.88

樣例說明

  第1次抽到的機率為0.005

  第2次抽到的機率為(1-0.005)*0.005

  第n次抽到的機率為(1-0.005)^(n-1)*0.005

  第250抽到的機率為之前都沒有抽到的機率,即(1-0.005)^249

  最終結果

資料規模和約定

  請使用double類型存儲所有浮點數變量

  對60%的測試點,保證k≤1000,

  對100%的測試點,保證k≤1000000。

  如果程式過于低效,在k較大時會因逾時而錯誤。

  

思路:其實規律就是Math.pow(p,k) 最後保留兩位小數輸出即可。定義一個double類型的方法,直接傳回他們之間的關系。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		double p = scanner.nextDouble();
		int k = scanner.nextInt();
		scanner.close();
		double ans = 0;
		for (int i = 0; i <= k - 1; i++) {
			ans += probability(p, i);                 // 調用方法
		}
		ans += k * Math.pow(1 - p, k - 1);            // 最後一個不需要添加成功的機率
		System.out.printf("%.2f", ans);               // 保留兩位輸出
	}

	public static double probability(double p, double i) {
		return i * Math.pow(1 - p, i - 1) * p;        // 前面的次數*失敗的機率,加上最後一個成功的機率
	}
}
           

小劇場:看星星在閃。Look at the stars.