(mathcal{Description})
有 (n) 堆石子,依次编号为 (1, 2,ldots , n),其中第 (i) 堆有 (a_i) 颗石子
你每次等概率随机选择一颗石子,并取完它所在的那一堆石子
求第 (1) 堆石子被取走的时间的期望
(nleq 10^5,a_ileq 10^9)
(mathcal{Solution})
这题不是很难,然而并不是考虑(DP),用的比较巧妙的方法
考虑期望的线性性,设(p_i)表示第(i)堆石子在第一堆石子前
若第(i)堆石子在第(1)堆石子前被取出来,那么就会多(1)次取走操作
换成期望就是(E=sumlimits_{i=2}^np_i*1)
现在的问题就是求(p_i)了
考虑第(i)堆石子在第(1)堆石子之前被取走
假设现在有(tot)个石子,那么取走(i)的概率是(dfrac{a_i}{tot}),取走(1)的概率是(dfrac{a_1}{tot})
无论(tot)的值是什么,第(i)堆石子比第(1)堆石子先被取走的概率都是(dfrac{a_i}{a_i+a_1})
于是这道题就解决了
(mathcal{Code})
/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年11月07日 星期四 20时01分34秒
*******************************/
#include <cstdio>
#include <fstream>
using namespace std;
const int maxn = 100005;
int n,x;
double ans;
int main()
{
scanf("%d%d",&n,&x);
for (int i=2;i<=n;++i){
int p;
scanf("%d",&p);
ans+=1.0*p/(x+p);
}
ans+=1;
printf("%.10lf
",ans);
return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧