http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=737
原作答案以及分析 http://blog.csdn.net/aaron_1996/article/details/53415209
//幸运硬币 2016年12月5日09:05:52
#include <bits/stdc++.h>
using namespace std;
#define MAXN 75 //迭代次数 ????????s
#define MAXM 11
int num[MAXM];
double p[MAXM];
double kill[MAXM][MAXN+2];//某种硬币被kill的概率
double reser[MAXM][MAXN+2] ;//某种硬币存活的概率
double ans[MAXM];
int m;
void solve (){
if (m==1)
{
ans[0]=1;
return ;
}
for(int i = 0 ; i < m ; ++i){
double tempp = p[i];
for (int j = 0 ; j <= MAXN ;++ j){
kill[i][j] = pow((1-tempp),num[i]);
reser[i][j] = 1-kill[i][j];
tempp*= p[i] ;
}
}
for (int i = 0 ; i < m ; ++i){
ans[i] = 0;
for (int j = 0 ; j < MAXN ; ++ j){
double x = 1;
for(int k = 0 ; k<m ;++k)
if(k!=i)
x *= kill[k][j];
ans[i]+= (reser[i][j]-reser[i][j+1])*x; //????
}
}
}
int main(){
int t ;
scanf("%d",&t);
while (t--){
cin>>m;
for(int i =0 ; i < m ;++i)
cin>>num[i]>>p[i];
solve();
for(int i = 0 ; i < m ; ++ i)
printf("%.6f%c",ans[i],i==m-1?'\n':' ');
}
return 0;
}
有两个点不是很明白, 其中的MAXN = 75 怎么计算出的?
还有就是 为什么计算ans的时候 用 reser[i][j]-reser[i][j+1] ?