其他分享
首页 > 其他分享> > codeforces 1453D. Checkpoints

codeforces 1453D. Checkpoints

作者:互联网

传送门


(别人翻译的)题目大意:需要设计一个游戏关卡,由01字符串组成1表示存档点0表示普通关卡,规定每一步可以从第\(i\)个关卡前进到第\(i+1\)个关卡,不过有\(\frac{1}{2}\)的概率会成功,剩下\(\frac{1}{2}\)的概率会失败,失败的话会返回最近的存档点重新开始,现在问如何设计关卡,可以使得到达终点的期望为\(k\).


cf又掉分了……年年三道题,次次都掉分,好菜啊。
(这次竟然就掉了一分……)


自己好久没整过期望,感觉又啥都不会了。


题解直接看看这位大佬的博客吧Frozen_Guardian的博客
我主要是想说一下递推式\(E_n = 2(E_{n-1}+1)\)怎么来的:
对于连续过关\(n\)次的期望次数\(E_n=E_{n-1}+1+?\),那么这一次有\(\frac{1}{2}\)概率成功,就不用更多次数了,即\(E_n=E_{n-1}+1+\frac{1}{2}*0 + ?\);有\(\frac{1}{2}\)的概率失败,那么就要从头再来,即\(E_n=E_{n-1}+1+\frac{1}{2}*0+\frac{1}{2}*E_n\)。就得到了前面说的公式。
然后用高中学的数列通项求法,就搞出了\(E_n = 2^n-2\).


剩下的大佬的博客已经很详细了。


贴一个主要代码:

int ans[maxn], cnt = 0;
In void solve(ll x)
{
	if(x & 1) {puts("-1"); return;}
	Mem(ans, 0), ans[cnt = 1] = 1;
	while(x)
	{
		ll tp = 1;
		while((1LL << (tp + 1)) - 2 <= x) ++tp;
		ans[cnt += tp - 1] = 1;
		x -= (1LL << tp) - 2;
	}
	write(cnt - 1), enter;
	for(int i = 1; i < cnt; ++i) write(ans[i]), space; enter;
}

标签:概率,frac,ll,codeforces,博客,Checkpoints,ans,1453D,关卡
来源: https://blog.51cto.com/u_15234622/2831612