hdu 4336 Card Collector —— Min-Max 容斥

题目: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\n",ans);
    }
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/Zinn/p/10274202.html