显然,这题有一种很简单的做法即直接状压卡牌的状态并转移期望的次数。但我们现在有一个更加强大的工具——min-max容斥。
min-max 容斥(对期望也成立):(E[max(S)] = sum_{Tsubseteq 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 ", ans); } return 0; }