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;
}

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

posted @ 2019-11-07 20:54  Morning_Glory  阅读(367)  评论(0编辑  收藏  举报
//