zoukankan      html  css  js  c++  java
  • 洛谷 P1365 WJMZBMR打osu! / Easy

    洛谷 P1365 WJMZBMR打osu! / Easy

    洛谷传送门

    题目背景

    原 维护队列 参见P1903

    题目描述

    某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(

    我们来简化一下这个游戏的规则

    有nn次点击要做,成功了就是o,失败了就是x,分数是按combo计算的,连续aa个combo就有a imes aa×a分,combo就是极大的连续o

    比如ooxxxxooooxxx,分数就是2 imes 2 + 4 imes 4 = 4 +16=202×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(4+9)/2=6.5了

    输入格式

    第一行一个整数n(nle3 imes10^5)n(n≤3×105),表示点击的个数

    接下来一个字符串,每个字符都是o,x,?中的一个

    输出格式

    一行一个浮点数表示答案

    四舍五入到小数点后44位

    如果害怕精度跪建议用long double或者extended


    题解:

    P1654OSU!的思路基本一样:

    分类讨论去求即可。

    代码:

    #include<cstdio>
    using namespace std;
    const int maxn=3*1e5+10;
    int n;
    char s[maxn];
    double dp[maxn],f[maxn];
    int main()
    {
        scanf("%d%s",&n,s+1);
        for(int i=1;i<=n;i++)
        {
            if(s[i]=='o')
                f[i]=f[i-1]+1;
            if(s[i]=='x')
                f[i]=0;
            if(s[i]=='?')
                f[i]=(f[i-1]+1)*0.5;
        }
        for(int i=1;i<=n;i++)
        {
            if(s[i]=='o')
                dp[i]=dp[i-1]+(2*f[i-1]+1);
            if(s[i]=='x')
                dp[i]=dp[i-1];
            if(s[i]=='?')
                dp[i]=dp[i-1]+(2*f[i-1]+1)*0.5;
        }
        printf("%.4lf",dp[n]);
        return 0;
    }
    
  • 相关阅读:
    CF809E Surprise me!
    2019-4-12-WPF-绑定的默认模式
    2019-4-12-WPF-绑定的默认模式
    2019-2-28-C#-16-进制字符串转-int-
    2019-2-28-C#-16-进制字符串转-int-
    2019-10-23-WPF-使用-SharpDx-异步渲染
    2019-10-23-WPF-使用-SharpDx-异步渲染
    2019-8-31-ASP.NET-Core-开启后台任务
    2019-8-31-ASP.NET-Core-开启后台任务
    2019-8-24-win10-uwp-读取文本GBK错误
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13844852.html
Copyright © 2011-2022 走看看