首页 > 其他 > 详细

P1365 WJMZBMR打osu! / Easy-洛谷luogu

时间:2019-02-12 14:34:55      阅读:178      评论:0      收藏:0      [点我收藏+]

传送门

题目背景

原 维护队列 参见P1903

题目描述

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

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

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

比如ooxxxxooooxxx,分数就是2 \times 2 + 4 \times 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了

输入输出格式

输入格式:

 

第一行一个整数nn,表示点击的个数

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

 

输出格式:

 

一行一个浮点数表示答案

四舍五入到小数点后44位

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

 

输入输出样例

输入样例#1: 复制
4
????
输出样例#1: 复制
4.1250

说明

osu很好玩的哦

WJMZBMR技术还行(雾),x基本上很少呢

 

--------------------------------------------------------------

很基础的期望的题

只要熟练掌握了dp

就没问题了

然而

唉.......

----------------------------------------------------------------

技术分享图片

-------------------------------------------------------------------------

#include<cstdio>
#include<iostream>
using namespace std;
double f[1000000],g[10000000];
int main()
{
    int n;
    char s[1000000],ch;
    scanf("%d",&n);
    cin>>s;
    for(int i=0;i<n;++i)
    {
        ch = s[i];
        if(ch == x)
        {
            f[i] = f[i - 1];
            g[i] = 0;
        }
        else
        if(ch == o) 
        {
            f[i] = f[i - 1] + 2 * g[i - 1] + 1;
            g[i] = g[i - 1] + 1;
        } 
        else
        {
            f[i] = f[i - 1] + g[i - 1] + 0.5;
            g[i] = g[i - 1]/2 + 0.5; 
        }        
    }
    printf("%.4lf\n",f[n-1]);
    return 0;
}

本来

我写的scanf

于是毫无疑问的wa了

我还一脸懵

后来才发现

循环出现了很大的问题

然而

在我发现循环有问题之前

我曾一度坚定不移的怀疑是不是自己的滚动数组写错了

唉,太傻了太傻了

循环输入字符串中的单个字符不能用scanf!!!!!

用cin

在循环一个个字符!!!!!!!

 

P1365 WJMZBMR打osu! / Easy-洛谷luogu

原文:https://www.cnblogs.com/darlingroot/p/10365009.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!