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 的话就是 oooxx(999),是x的话就是 ooxxx(444),期望自然就是 (4+9)/2=6.5(4+9)/2 =6.5(4+9)/2=6.5 了。
输入格式
第一行一个整数 nnn(n≤3×105n\le3\times10^5n≤3×105),表示点击的个数
接下来一个字符串,每个字符都是 o,x,? 中的一个
输出格式
一行一个浮点数表示答案
四舍五入到小数点后 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P1365 WJMZBMR打osu! Easy&spm=1001.2101.3001.5002&articleId=155155299&d=1&t=3&u=4372a98a66ed41c2af1182694be3e9d9)
2654

被折叠的 条评论
为什么被折叠?



