题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336
bzoj 4036 的简单版,Min-Max 容斥即可。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef double db; int const xn=25,xm=(1<<20)+5; int n,bin[xn]; db p[xn],mn[xm]; int cal(int s){int ret=0; while(s)ret+=(s&1),s>>=1; return ret;} int main() { bin[0]=1; for(int i=1;i<=20;i++)bin[i]=(bin[i-1]<<1); while(~scanf("%d",&n)) { int mx=(1<<n); for(int i=1;i<=n;i++)scanf("%lf",&p[i]); for(int T=1;T<mx;T++) { db sum=0; for(int i=1;i<=n;i++)if(T&bin[i-1])sum+=p[i]; mn[T]=1/sum; } db ans=0; for(int T=1;T<mx;T++)ans+=mn[T]*((cal(T)&1)?1:-1); printf("%.10f ",ans); } return 0; }