• BZOJ3450——Tyvj1952(OSU?)


    某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(
    我们来简化一下这个游戏的规则
    有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o。
    比如ooxxxxooooxxx,分数就是2^2+ 4^4=4+16=20。
    Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是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
    提示
    n<=300000
    osu很好玩的哦
    WJMZBMR技术还行(雾),x基本上很少呢

    开始看题把aaa*a看成了aaa^a

    我:WTF?

    想半天想不出来去看题解。。?

    我:Excuse me?

    然后。。。。就是道水题了吧

    一个ll表示当前期望的连续的o的长度

    考虑到对每次新加进一个o

    其对答案的贡献是(l+1)2l2=l2+1(l+1)^2-l^2=l*2+1

    那么有3种情况:

    1、当前为x:

    l=0l=0

    2、当前为o:

    ans+=l2+1,l++ans+=(l*2)+1,l++

    3、当前为?:

    ans+=((l2)+1)/2,l=(l+1)/2ans+=((l*2)+1)/2,l=(l+1)/2

    这里应该很好想吧,因为对于当前这个有为x和为o两种情况,所以要除以2

    #include<bits/stdc++.h>
    using namespace std;
    double ans,l;
    int n;
    char s[300005];
    int main(){
        cin>>n;
        cin>>s+1;
        for(int i=1;i<=n;i++){
            if(s[i]=='x')l=0;
            else if(s[i]=='o') ans+=(l++)*2+1;
            else if(s[i]=='?') ans+=(l*2+1)/2,l=(l+1)/2;
         }
         printf("%.4lf",ans);
    }
    
  • 相关阅读:
    WebForm中使用MVC
    CPAN镜像使用帮助
    关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation
    XML之命名空间的作用(xmlns)
    xml相关术语说明
    .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
    BZOJ3734 : [Ontak2013]Miny
    BZOJ3448 : [Usaco2014 Feb]Auto-complete
    BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
    BZOJ3619 : [Zjoi2014]璀灿光华
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366461.html
Copyright © 2020-2023  润新知