min-max容斥
min-max容斥是指给定集合(S),设(max(S))表示(S)中的最大值,(min(S))表示集合中的最小值,则有
[max(S)=sum_{Tsubseteq S}(-1)^{|T|-1}min(T)
]
相关题目
hdu4336 Card Collector
有(n)件物品,每一秒有可能获得其中的一件物品(i),概率为(p_i),求获得所有物品的期望时间。
设(max(S))表示第一次获得(S)中最后一种卡片的期望时间,(min(S))表示第一次获得(S)中第一种卡片的期望时间
其中(min(S)=frac{1}{sum_{iin T}P_i})
时间复杂度(O(2^n))
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<algorithm>
#define LL long long
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define pi acos(-1.0)
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=25;
int n;
double p[maxn],ans;
void dfs(int id,int k,double sum){
if(id==n){
if(sum<eps) return;
if(k&1) ans+=1/sum;
else ans-=1/sum;
return;
}
dfs(id+1,k+1,sum+p[id]);
dfs(id+1,k,sum);
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++) scanf("%lf",&p[i]);
ans=0.0;
dfs(0,0,0.0);
printf("%.4f
",ans);
}
return 0;
}