題意:要收集n種卡片,每種卡片能收集到的機率位pi,求收集完這n種卡片的指望。其中sigma{pi} <=1;
ide
思路:容斥原理。就是一加一減,那麼如何算指望呢。若是用二進制表示,0表示未收集到,1表示收集到。spa
那麼1/p1(p1表示的是事件1發生的機率)表示的是1發生的指望,這邊包括001,011,111,101code
同理,1/p2包括的是010,011,111,110blog
1/p3:100,101,111,110事件
咱們知道若是一件事發生的機率爲pi,那麼第一次發生這件事次數指望爲1/pi。io
同理,a和b這兩件事發生的機率爲p1,p2,則第一次發生某一件事發生的次數指望爲1/(p1+p2)event
知道這些以後,那麼就要用到容斥來去重了。class
#include <cstdio> using namespace std; const int maxn = 22; double p[maxn]; int main() { int n; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%lf", &p[i]); int tot = (1 << n); double ans = 0.0; for (int i = 1; i < tot; i++) { double sum = 0.0; int cnt = 0; for (int j = 0; j < n; j++) { if (i & (1 << j)) { cnt++; sum += p[j]; } } if (cnt & 1) ans += 1.0 / sum; else ans -= 1.0 / sum; } printf("%.4f\n", ans); } return 0; }