zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    装饰器实例
    生成器、迭代器脚本实例
    魔法方法和属性
    随机生成验证码
    认证客户端的链接合法性
    将socket通信实现多进程
    线程锁模拟抢票系统
    ntp时间服务器
    蛇形串---------
    两年内计划
  • 原文地址:https://www.cnblogs.com/mrclr/p/14094685.html
Copyright © 2011-2022 走看看