[京东2017实习生笔试] 通过考试
时间限制C/C++语言:1000MS其它语言:3000MS
内存限制C/C++语言:65536KB其它语言:589824KB
题目描述
小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少60%的题目才能通过考试。考试结束后,小明估算出每题做对的概率,p1,p2,...,pn。你能帮他算出他通过考试的概率吗?
输入
输入第一行一个数n(1<=n<=100),表示题目的个数。第二行n个整数,p1,p2,...,pn。表示小明有pi%的概率做对第i题。(0<=pi<=100)
输出
小明通过考试的概率,最后结果四舍五入,保留小数点后五位。
样例输入
4
50 50 50 50
样例输出
0.31250
思路
DP。dp[i][j]表示前i门课程通过j门的概率。则dp[i][j] = dp[i - 1][j - 1] * p[i] + dp[i - 1][j] * (1 - p[i])。
代码
1 import java.util.Scanner; 2 3 public class Main { 4 5 public static double solve(double[] p) { 6 final int n = p.length; 7 double[][] dp = new double[n + 1][n + 1]; 8 dp[0][0] = 1; 9 for (int i = 1; i <= n; i++) { 10 for (int j = 0; j <= i; j++) { 11 if (j == 0) { 12 dp[i][0] = dp[i - 1][0] * (1 - p[i - 1]); 13 } else { 14 dp[i][j] = dp[i - 1][j - 1] * p[i - 1] + dp[i - 1][j] * (1 - p[i - 1]); 15 } 16 } 17 } 18 19 double ps = 0; 20 for (int i = 0; i <= n; i++) { 21 if (10 * i >= 6 * n) { 22 ps += dp[n][i]; 23 } 24 } 25 return ps; 26 } 27 28 public static void main(String[] args) { 29 Scanner sc = new Scanner(System.in); 30 int n = sc.nextInt(); 31 double[] p = new double[n]; 32 for (int i = 0; i < n; i++) { 33 p[i] = (double) sc.nextInt() / 100; 34 } 35 System.out.println(String.format("%.5f", solve(p))); 36 } 37 }