记 $min\{S\}$ 为集合 $S$ 中最小值,$max\{S\}$ 为集合 $S$ 中最大值
则有 $max\{S\}=\sum\limits_{T \subseteq S,T \neq \emptyset}(-1)^{|T|-1}min\{T\}$
这个东西可以用来求“全都出现的期望时间”
hdu4336 Card Collector
有 n 种卡片,每秒你有 $P_i$ 的概率获得第 $i$ 张卡片,求获得所有卡片至少一张的期望时间
$n \leq 20$
sol:
直接套上面那个式子,令 $max\{S\}$ 为得到 $S$ 集合中最晚的一张的期望时间,易得这也是得到 $S$ 集合的期望时间
然后套一下式子,就只用对于 $S$ 的每一个子集 $T$ ,计算出至少得到一个 $T$ 中元素的期望时间
易得 $min\{T\}=\frac{1}{\sum\limits_{i \in T}P_i}$
然后就做完了
#include<bits/stdc++.h> #define LL long long using namespace std; inline int read() { int x = 0,f = 1;char ch = getchar(); for(;!isdigit(ch);ch = getchar())if(ch == '-') f = -f; for(;isdigit(ch);ch = getchar())x = 10 * x + ch - '0'; return x * f; } int n;double p[25],ans; void dfs(int x,double e,int opt) { if(x > n) { if(e > 1e-7)ans += opt / e; return; } dfs(x + 1,e,opt); dfs(x + 1,e + p[x],-opt); } int main() { while(scanf("%d",&n) != EOF) { for(int i=1;i<=n;i++)cin >> p[i]; ans = 0;dfs(1,0,-1); printf("%.6lf\n",ans); } }