Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 4684 | Accepted: 2050 |
Description
Input
Output
Sample Input
2 2 2 0.9 0.9 1 0.9 0 0 0
Sample Output
0.972
ACM有T支队伍,共有M道题,给出每支队伍A出每到题目的概率,求所有队伍至少A出一道而且第一名至少A出N道,注意有可能并列第一。
令事件A:每支队伍至少算出一道题的概率。
B:至少有一支队伍A出至少N道题目。
那么P(AB)=P(A)-P(A(~B));
用dp[i][j][k]表示,第i支队伍在前j题A出k道题目。p[i][j][k]=p[i][j-1][k]*(1-a[i][j])+p[i][j-1][k-1]*a[i][j];
AC代码:
#include <iostream> #include <cmath> #include <stdio.h> #include <algorithm> #include <ctime> #include <vector> #include <cstring> #include <map> #include <string> #include <queue> //#include <fstream> using namespace std; #define LL long long #define ULL unsigned long long //#define REP(i,n) for(int i=0;i<n;++i) #define REP(i,a,b) for(int i=a;i<=b;++i) #define INFLL (1LL)<<62 #define mset(a) memset(a,0,sizeof a) #define FR(a) freopen(a,"r",stdin) #define FW(a) freopen(a,"w",stdout) #define PI 3.141592654 const LL MOD = 1000000007; const int M=33; const int maxn=1002; int m,n,t; double p[maxn][M][M]; double a[maxn][M]; int main() { while (cin>>m>>t>>n,m) { mset(p); REP(i,1,t){ REP(j,1,m) scanf("%lf",a[i]+j); p[i][0][0]=1; REP(j,1,m){ p[i][j][0]=p[i][j-1][0]*(1-a[i][j]); REP(k,1,j){ p[i][j][k]=p[i][j-1][k]*(1-a[i][j])+p[i][j-1][k-1]*a[i][j]; } } } double ans=0,ab_=1,a=1; REP(i,1,t) { double temp=0; REP(j,1,n-1) temp+=p[i][m][j]; ab_*=temp; a*=1-p[i][m][0]; } ans=a-ab_; printf("%.3lf\n",ans); } }
#include <iostream> #include <cmath> #include <stdio.h> #include <algorithm> #include <ctime> #include <vector> #include <cstring> #include <map> #include <string> #include <queue> //#include <fstream> using namespace std; #define LL long long #define ULL unsigned long long //#define REP(i,n) for(int i=0;i<n;++i) #define REP(i,a,b) for(int i=a;i<=b;++i) #define INFLL (1LL)<<62 #define mset(a) memset(a,0,sizeof a) #define FR(a) freopen(a,"r",stdin) #define FW(a) freopen(a,"w",stdout) #define PI 3.141592654 const LL MOD = 1000000007; const int M=33; const int maxn=1002; int m,n,t; double p[maxn][M][M]; double a[maxn][M]; int main() { while (cin>>m>>t>>n,m) { mset(p); REP(i,1,t){ REP(j,1,m) scanf("%lf",a[i]+j); p[i][0][0]=1; REP(j,1,m){ p[i][j][0]=p[i][j-1][0]*(1-a[i][j]); REP(k,1,j){ p[i][j][k]=p[i][j-1][k]*(1-a[i][j])+p[i][j-1][k-1]*a[i][j]; } } } double ans=0,ab_=1,a=1; REP(i,1,t) { p[i][m][1]=1-p[i][m][0]; REP(j,n+1,m) p[i][m][n]+=p[i][m][j]; ab_*=(p[i][m][1]-p[i][m][n]); a*=p[i][m][1]; } ans=a-ab_; printf("%.3lf\n",ans); } }