HDU4336 Card Collector

前置芝士——minmax容斥

\[max\{S\}=\sum_{T\subseteq S}(-1)^{\left|T\right|+1}min\{T\} \]

\[min\{S\}=\sum_{T\subseteq S}(-1)^{\left|T\right|+1}max\{T\} \]

思路

在dummy的帮助下勉强看了看minmax容斥
感觉是个神奇的东西,扩展根本没有看懂XD
然后这题就是板子了,minmax套上期望好像也很可做

\[E(max\{S\})=\sum_{T\subseteq S}(-1)^{\left|T\right|+1}E(min\{T\}) \]

\(max\{S\}\)理解成全集中出现最多个(每个都出现),\(min\{T\}\)理解成T集合中出现最少(就是从中获得一个),然后T就是T集合中的物品的概率之和
然后期望的量等于1/全出现的期望
dfs枚举集合即可

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
double p[40],ans;
int n;
void dfs(int num,double t,int opt){
    if(num==n){
        if(t)
            ans+=1.0*opt/t;
        return;
    }
    dfs(num+1,t,opt);
    dfs(num+1,t+p[num+1],-opt);
}
int main(){
    while(scanf("%d",&n)==1){
        ans=0;
        for(int i=1;i<=n;i++){
            scanf("%lf",&p[i]);
        }
        dfs(0,0,-1);
        printf("%.4lf\n",ans);
    }
    return 0;
}
posted @ 2019-02-27 17:31  dreagonm  阅读(103)  评论(0编辑  收藏  举报