Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 7104 | Accepted: 3078 |
Description
1. All of the teams solve at least one problem.
2. The champion (One of those teams that solve the most problems) solves at least a certain number of problems.
Now the organizer has studied out the contest problems, and through the result of preliminary contest, the organizer can estimate the probability that a certain team can successfully solve a certain problem.
Given the number of contest problems M, the number of teams T, and the number of problems N that the organizer expect the champion solve at least. We also assume that team i solves problem j with the probability Pij (1 <= i <= T, 1<= j <= M). Well, can you calculate the probability that all of the teams solve at least one problem, and at the same time the champion team solves at least N problems?
Input
Output
Sample Input
2 2 2 0.9 0.9 1 0.9 0 0 0
Sample Output
0.972
爲啥分類到哈希表和二分等高效查找法???坑???
#include <iostream>
#include <cstring>
#include <cstdio>
#include <iomanip>
using namespace std;
const int maxn=1010;
double dp[maxn][33] [33];
double p[maxn][33];
double p1,p2;
int m,t,n;
int main()
{
int i,j,k;
while(cin>>m>>t>>n)
{
if(m==0 && t==0 && n==0)
{
return 0;
}
for(i=1; i<=t; i++)
{
for(j=1; j<=m; j++)
{
cin>>p[i][j];
}
}
///判斷dp邊界
for(i=1; i<=t; i++)
{
dp[i][0][0]=1.0; ///第i隊 前0題 a了0道 概率必然是1
for(j=1; j<=m; j++)
{
dp[i][0][j]=0.0; ///第i隊 前0題 a了j(j>=1)道 概率必然是0
dp[i][j][0]=dp[i][j-1][0]*(1-p[i][j]); ///繼續求前j道題全錯的情況
}
}
///求dp[i][j][k]的循環過程 第i隊 前j題 a了k道
for(i=1; i<=t; i++)
{
for(j=1; j<=m; j++)
{
for(k=1; k<=j; k++)
{
dp[i][j][k]=dp[i][j-1][k-1]*p[i][j]+dp[i][j-1][k]*(1-p[i][j]);
}
}
}
///p2-p1 就是隊伍a至多n道的概率 ??exm ??
p1=1.0; ///所有隊伍a 1~n-1 道的概率
p2=1.0; ///所有隊至少a一道的概率
for(i=1; i<=t; i++)
{
p2=p2*(1-dp[i][m][0]); ///至少a一道
}
for(i=1; i<=t; i++)
{
double sum=0.0;
for(j=1; j<n; j++)
{
sum+=dp[i][m][j];
}
p1=p1*sum;
}
printf("%.3f\n",p2-p1);
}
return 0;
}