前置芝士——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;
}