zoukankan      html  css  js  c++  java
  • tyvj Easy

    Easy

    [描述 Description]

    某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(
    我们来简化一下这个游戏的规则
        有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续acomb就有a*a分,comb就是极大的连续o
        比如ooxxxxooooxxx,分数就是2*2+4*4=4+16=20Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是o要么是x,有些地方o或者x各有50%的可能性,用?号来表示。比如oo?xx就是一个可能的输入。
        那么WJMZBMR这场osu的期望得分是多少呢?
    比如oo?xx的话,?o的话就是oooxx => 9,是x的话就是ooxxx => 4
    期望自然就是(4+9)/2 =6.5

     

    【输入格式】 

    第一行一个整数n,表示点击的个数
    接下来一个字符串,每个字符都是ox?中的一个

     

    【输出格式】 

    一行一个浮点数表示答案
    四舍五入到小数点后4
    如果害怕精度跪建议用long double或者extended

     

    【样例输入】

    4

    ????

    【样例输出】

    4.1250

    【数据范围】

    Time Limitation时限1s每个测试点
    k表示?号的个数
    100%的数据 : n<=300000
    70%的数据 : k<=20
    40%的数据 : n<=200k<=20

     

    又是期望o(︶︿︶)o 唉

    晕了好久

    果然还是太弱了

    奇迹的是最后竟然过了~

    后来g_word神犇提出了一种新的理解方式,真是豁然开朗啊(Orz)

    我的做法是这样子的:

    动规:f[i] 代表 i 的期望。T[i] 代表 最后连续的o的期望长度(g_word神犇提出的,给跪了)。

    这样理解就可以看成是没有?的情况做了。

    于是转移就很显然了。

    对于?的话期望长度就要除以2了。否则要么+1要么=0

    f的话只有碰到?或x才需要更新。

    标程用了一种非常高端莫测的做法,看不懂……

    UPD:忘了贴代码了

    #include <cstdio>
    int n;
    long double f[300000 + 9],T[300000 + 9];
    int main()
    {
    	#ifndef ONLINE_JUDGE
    	freopen("easy.in","r",stdin);
    	freopen("easy.out","w",stdout);
    	#endif
    	scanf("%d
    ",&n);
    	for (int i = 1; i <= n; ++i) {
    		char c = getchar();
    		if (c == 'x') {
    			f[i] = f[i - 1];
    			T[i] = 0;
    		}else if (c == 'o') {
    			f[i] = f[i - 1] + 2*T[i - 1] + 1;
    			T[i] = T[i - 1] + 1;
    		}else {
    			f[i] = f[i - 1] + T[i - 1] + 0.5;
    			T[i] = (T[i - 1] + 1)/2;
    		}
    	}
    	printf("%.4f
    ",(double)f[n]);
    }
    

      

  • 相关阅读:
    Dingo/api 学习笔记
    Composer install 报错
    bootstrap4 调整元素之间距离
    css font-family常用的黑体宋体等字体中英文对照
    mac 开关机
    lodash.memoize
    Evevt Loop 事件循环
    mac 安装 XX-Net-3.12.11
    mac端口占用
    npm 安装/删除/发布/更新/撤销 发布包
  • 原文地址:https://www.cnblogs.com/lazycal/p/3388285.html
Copyright © 2011-2022 走看看