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;
}