【hdu 4336】Card Collector

nekko

2018-12-24 19:01:48

Personal

### 题目描述 有 $n$ 种卡片,每一秒都有 $p_i$ 的概率获得一张第 $i$ 种卡片,求每张卡片都至少有一张的期望时间 $n \le 20$ ### 题解 考虑 `min-max 容斥`,$E(\max(S))=\sum_{T \subseteq S}(-1)^{\mid T \mid + 1}E(\min(T))$ 考虑 $E(\min(T))$ 的意义,即某个集合的至少获得其中一个元素的期望次数 由于每个元素的获得概率互不相关,因此: $$E(\min(T))=(\sum\limits_{x \in T}p_x)1+(1-\sum\limits_{x \in T}p_x)(E(\min(T)) + 1)$$ 即 $E(\min(T)) = \frac{1}{\sum\limits_{x \in T}p_x}$ 然后枚举子集就行了…… ### 题解 ``` cpp #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 30; int n; double p[N]; void sol() { for(int i = 1 ; i <= n ; ++ i) scanf("%lf", &p[i]); double res = 0; for(int s = 1 ; s < (1 << n) ; ++ s) { int cnt = 0; double sum = 0; for(int i = 1 ; i <= n ; ++ i) { if(s & (1 << (i - 1))) { ++ cnt; sum += p[i]; } } res += (cnt & 1 ? 1.0 : -1.0) / sum; } printf("%.4f\n", res); } int main() { while(scanf("%d", &n) == 1) { sol(); } } ```