【題解】HDU4336 Card Collector
阿新 • • 發佈:2018-12-22
顯然,這題有一種很簡單的做法即直接狀壓卡牌的狀態並轉移期望的次數。但我們現在有一個更加強大的工具——min-max容斥。
min-max 容斥(對期望也成立):\(E[max(S)] = \sum_{T\subseteq S}^{\ }(-1)^{|T| - 1}E[min(T)]\)
我們可以讓 \(E[max(S)]\) 表示 \(S\) 中所有元素均出現的期望時間(即最後一個元素出現的期望時間),\(E[min(S)]\) 表示 \(S\) 中任意一個元素出現的期望時間(即第一個元素出現的期望時間)。
那麼,我們可以直接 \(2^{n}\) 列舉 \(T\) ,然後 \(E[min(T)] = \frac{1}{P}\) 。
Why? 原本用期望的定義式計算為:\(\sum_{i=1 }^{+\infty} P*(1 - P)^{i - 1}*i\),用等比數列求和即可求得。
#include <cstdio> using namespace std; #define db double #define maxn 100 int n, cnt; db ans, P, a[maxn]; void dfs(int now) { if(now == n + 1) { if(!cnt) return; db T = (db) 1/ P; ans += (cnt & 1) ? T : -T; return; } P += a[now]; cnt ++; dfs(now + 1); P -= a[now]; cnt --; dfs(now + 1); } int main() { while(~scanf("%d", &n)) { ans = 0; for(int i = 1; i <= n; i ++) scanf("%lf", &a[i]); dfs(1); printf("%.6lf\n", ans); } return 0; }