POJ2151 Check the difficulty of problems

Description

Organizing a programming contest is not an easy job. To avoid making the problems too difficult, the organizer usually expect the contest result satisfy the following two terms:

  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(1iT,1jM). 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

The input consists of several test cases. The first line of each test case contains three integers M(0<M30),T(1<T1000) and N(0<NM). Each of the following T lines contains M floating-point numbers in the range of [0,1]. In these T lines, the j-th number in the i-th line is just Pij. A test case of M = T = N = 0 indicates the end of input, and should not be processed.

Output

For each test case, please output the answer in a separate line. The result should be rounded to three digits after the decimal point.

Sample Input

2 2 2
0.9 0.9
1 0.9
0 0 0

Sample Output

0.972

题目大意,给T个队伍,M个题目,给出每个队伍做出每个题的概率Pij,求每个队伍至少做出一道题,且冠军队伍至少做出N道题的概率

由于每个队伍做题的概率是独立的,所以我们可以提前统计出第i个队伍至少做出k个题的概率F[i][k]

然后我们统计出每个队伍至少做出1道题的概率Ans1,再统计出每个队伍做出1 N1的概率Ans2,答案即为Ans1Ans2

/*program from Wolfycz*/
#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Fi first
#define Se second
#define lMax 1e18
#define MK make_pair
#define iMax 0x7f7f7f7f
#define sqr(x) ((x)*(x))
#define pii pair<int,int>
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
template<typename T>inline T read(T x){
    int f=1; char ch=getchar();
    for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')	f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    return x*f;
}
inline void print(int x){
    if (x<0)	putchar('-'),x=-x;
    if (x>9)	print(x/10);
    putchar(x%10+'0');
}
const int N=1e3,M=30;
double P[N+10][M+10],F[N+10][M+10];
int main(){
    while (true){
        int m=read(0),n=read(0),k=read(0);
        //m:problems n:teams
        memset(F,0,sizeof(F));
        if (!(n+m+k))   break;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
                scanf("%lf",&P[i][j]);
        for (int i=1;i<=n;i++){
            F[i][0]=1;
            for (int j=1;j<=m;j++){
                for (int k=j;k;k--)
                    F[i][k]=F[i][k-1]*P[i][j]+F[i][k]*(1-P[i][j]);
                F[i][0]*=(1-P[i][j]);
            }
            for (int j=1;j<=m;j++)  F[i][j]+=F[i][j-1];
        }
        double Ans1=1,Ans2=1;
        for (int i=1;i<=n;i++)  Ans1*=1-F[i][0];
        for (int i=1;i<=n;i++)  Ans2*=F[i][k-1]-F[i][0];
        printf("%.3f\n",Ans1-Ans2);
    }
    return 0;
}
posted @   Wolfycz  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示