显然,这题有一种很简单的做法即直接状压卡牌的状态并转移期望的次数。但我们现在有一个更加强大的工具——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 + )
{
if(!cnt) return;
db T = (db) / P;
ans += (cnt & ) ? T : -T;
return;
}
P += a[now]; cnt ++; dfs(now + );
P -= a[now]; cnt --; dfs(now + );
} int main()
{
while(~scanf("%d", &n))
{
ans = ;
for(int i = ; i <= n; i ++)
scanf("%lf", &a[i]);
dfs(); printf("%.6lf\n", ans);
}
return ;
}