【題解】HDU4336 Card Collector

  顯然,這題有一種很簡單的作法即直接狀壓卡牌的狀態並轉移指望的次數。但咱們如今有一個更增強大的工具——min-max容斥。工具

    min-max 容斥(對指望也成立):\(E[max(S)] = \sum_{T\subseteq S}^{\ }(-1)^{|T| - 1}E[min(T)]\)spa

  咱們能夠讓 \(E[max(S)]\) 表示 \(S\) 中全部元素均出現的指望時間(即最後一個元素出現的指望時間),\(E[min(S)]\) 表示 \(S\) 中任意一個元素出現的指望時間(即第一個元素出現的指望時間)。code

  那麼,咱們能夠直接 \(2^{n}\) 枚舉 \(T\) ,而後 \(E[min(T)] = \frac{1}{P}\) 。blog

  Why? 本來用指望的定義式計算爲:\(\sum_{i=1 }^{+\infty} P*(1 - P)^{i - 1}*i\),用等比數列求和便可求得。io

#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;
}
相關文章
相關標籤/搜索