打卡信奥刷题(2432)用C++实现信奥 P1365 WJMZBMR打osu! / Easy

P1365 WJMZBMR打osu! / Easy

题目背景

原 维护队列 参见 P1903

题目描述

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

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

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

比如ooxxxxooooxxx,分数就是 2×2+4×4=4+16=202 \times 2 + 4 \times 4 = 4 +16=202×2+4×4=4+16=20

Sevenkplus 闲的慌就看他打了一盘,有些地方跟运气无关要么是 o 要么是 x,有些地方 o 或者 x 各有 50%50\%50% 的可能性,用 ? 号来表示。

比如 oo?xx 就是一个可能的输入。
那么 WJMZBMR 这场 osu 的期望得分是多少呢?

比如 oo?xx 的话,?o 的话就是 oooxx999),是x的话就是 ooxxx444),期望自然就是 (4+9)/2=6.5(4+9)/2 =6.5(4+9)/2=6.5 了。

输入格式

第一行一个整数 nnnn≤3×105n\le3\times10^5n3×105),表示点击的个数

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

输出格式

一行一个浮点数表示答案

四舍五入到小数点后 444

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

输入输出样例 #1

输入 #1

4
????

输出 #1

4.1250

C++实现

    /*Code by 520 -- 7.29*/
    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
    using namespace std;
    int n,cnt;
    char s;
    double f[2],g[2];
    int main(){
        ios::sync_with_stdio(0);
        cin>>n;
        For(i,1,n){
            cin>>s;
            if(s=='x') f[cnt^1]=f[cnt],g[cnt^1]=0;
            else if(s=='o') f[cnt^1]=f[cnt]+2*g[cnt]+1,g[cnt^1]=g[cnt]+1;
            else f[cnt^1]=f[cnt]+g[cnt]+0.5,g[cnt^1]=g[cnt]/2+0.5;
            cnt^=1;
        }
        printf("%.4lf",f[cnt]);
        return 0;
    }

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值