HDU4336 Card Collector

前置芝士——minmax容斥

[max{S}=sum_{Tsubseteq S}(-1)^{left|T ight|+1}min{T} ]

[min{S}=sum_{Tsubseteq S}(-1)^{left|T ight|+1}max{T} ]

思路

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

[E(max{S})=sum_{Tsubseteq S}(-1)^{left|T ight|+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
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dreagonm/p/10445267.html