比赛
比赛
http://www.nowcoder.com/questionTerminal/23e79acc53ae46118f8a7d4e53b9a40b
https://ac.nowcoder.com/acm/problem/14734
题目理解:题意很简单,就是给你12道题3种途径的概率,求解决0~12题的概率。
题目分析:正着求每道题解决的概率,显然有点困难,那么我们不妨逆向考虑一下每道题无法解决的概率,答案显然 fail[i]=(1-a[i])(1-b[i])(1-c[i]) ** (fail[i]表示第i题无法解决的概率),之后就可以得知每道题成功的概率ac[i]=1-wa[i]。注意一下数据,总题数才12道,直接暴力dfs就行了,复杂度O(n^2),稳过,放弃思考dp了。
代码:
#include<stdio.h>
int n=12,i,j;
double a[16],b[16],c[16],wa[16],ac[16],ans[16];
void dfs(int now,int acc,double pro){//now表示当前解题位置,acc表示题目解决数量,pro代表当前情况概率
if(now==13){
ans[acc]+=pro;//加上当前概率
return;
}
dfs(now+1,acc+1,pro*ac[now]);//当前成功
dfs(now+1,acc,pro*wa[now]);//当前失败
}
int main()
{
for(i=1;i<=n;i++){
scanf("%lf",&a[i]);
}
for(i=1;i<=n;i++){
scanf("%lf",&b[i]);
}
for(i=1;i<=n;i++){
scanf("%lf",&c[i]);
}
for(i=1;i<=n;i++){
wa[i]=(1-a[i])*(1-b[i])*(1-c[i]);//第i题没解出的概率
ac[i]=1-wa[i];//第i题成功解出的概率
}
dfs(1,0,1.0);
for(i=0;i<=n;i++){
printf("%.6lf\n",ans[i]);
}
}