[京东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 }

 

posted @ 2017-04-07 21:43  deadend  阅读(922)  评论(0编辑  收藏  举报