官方题解:http://wyfcyx.is-programmer.com/posts/95490.html

 

A

  目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算?

 1 //Round2 A
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define rep(i,n) for(int i=0;i<n;++i)
 8 #define F(i,j,n) for(int i=j;i<=n;++i)
 9 #define D(i,j,n) for(int i=j;i>=n;--i)
10 #define pb push_back
11 using namespace std;
12 typedef long long LL;
13 inline int getint(){
14     int r=1,v=0; char ch=getchar();
15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
17     return r*v;
18 }
19 const int N=110;
20 /*******************template********************/
21 int n,m;
22 double a[10][110];
23 
24 void work1(){
25     double ans=1.0;
26     F(i,1,m) ans*=(1.0-a[1][i]);
27     printf("%.9f\n",1.0-ans);
28 }
29 void work2(){
30     double ans=0.0;
31     F(i,1,m) ans*=(1.0-a[1][i]);
32 }
33 int mp[10][110],my[N];
34 bool vis[N];
35 long double ans=0.0,gailv=1.0;
36 
37 bool go(int x){
38     F(i,1,m)
39         if (mp[x][i] && !vis[i]){
40             vis[i]=1;
41             if (!my[i]||go(my[i])){
42                 my[i]=x;
43                 return 1;
44             }
45         }
46     return 0;
47 }
48 void check(){
49 //    F(i,1,n){ F(j,1,m) printf("%d ",mp[i][j]); puts("");}
50     int tmp=0;
51     memset(my,0,sizeof my);
52     F(i,1,n){
53         memset(vis,0,sizeof vis);
54         if (go(i)) tmp++;
55     }
56     double gl=gailv;
57 //    printf("%d %.9f\n\n",tmp,gl);
58     ans+=tmp*gailv;
59 }
60 void dfs(int x,int y){
61 //    printf("dfs %d %d\n",x,y);
62     if (x==n+1){check();return;}
63     D(i,1,0){
64         mp[x][y]=i;
65         gailv*=i*a[x][y]+(1-i)*(1.0-a[x][y]);
66         if (y==m) dfs(x+1,1);
67         else dfs(x,y+1);
68         mp[x][y]=0;
69         gailv/=i*a[x][y]+(1-i)*(1.0-a[x][y]);
70     }
71 }
72 void work3(){
73     dfs(1,1);
74     double as=ans;
75     printf("%.9f\n",as);
76 }
77 int main(){
78 #ifndef ONLINE_JUDGE
79     freopen("A.in","r",stdin);
80     freopen("A.out","w",stdout);
81 #endif
82     n=getint(); m=getint();
83     F(i,1,n) F(j,1,m) scanf("%lf",&a[i][j]);
84     if (n==1) work1();
85 //    else if (n==2) work2();
86     else 
87         work3();
88     return 0;
89 }
View Code(30分)

相关文章: