1.通过考试
小明同学要参加一场考试,考试一共有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[i][j]表示前i道题目做对了j道的概率 dp[i][j] = (1 - p[i])*dp[i-1][j] + p[i]*dp[i-1][j-1]
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> p(n+1);
for(int i=1; i<=n; i++)
cin>>p[i];
vector<vector<double> > dp(n+1, vector<double>(n+1, 0));
dp[0][0] = 1;
for(int i=1; i<=n; i++)
{
dp[i][0] = dp[i-1][0] * (100 - p[i]) / 100.0;
for(int j=1; j<=n; j++)
dp[i][j] = dp[i-1][j] * (100 - p[i]) / 100.0 + dp[i-1][j-1] * p[i] / 100.0;
}
double ans = 0;
for(int j=(3*n+4)/5; j<=n; j++)
ans += dp[n][j];
printf("%.5f\n", ans);
return 0;
}