stone [期望]
\(\mathcal{Description}\)
有 \(n\) 堆石子,依次编号为 \(1, 2,\ldots , n\),其中第 \(i\) 堆有 \(a_i\) 颗石子
你每次等概率随机选择一颗石子,并取完它所在的那一堆石子
求第 \(1\) 堆石子被取走的时间的期望
\(n\leq 10^5,a_i\leq 10^9\)
\(\mathcal{Solution}\)
这题不是很难,然而并不是考虑\(DP\),用的比较巧妙的方法
考虑期望的线性性,设\(p_i\)表示第\(i\)堆石子在第一堆石子前
若第\(i\)堆石子在第\(1\)堆石子前被取出来,那么就会多\(1\)次取走操作
换成期望就是\(E=\sum\limits_{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\n",ans);
return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧