题目背景
原 维护队列 参见P1903
题目描述
某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(
我们来简化一下这个游戏的规则
有nn次点击要做,成功了就是o
,失败了就是x
,分数是按combo计算的,连续aa个combo就有a imes aa×a分,combo就是极大的连续o
。
比如ooxxxxooooxx
x,分数就是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了
输入输出格式
输入格式:
第一行一个整数nn,表示点击的个数
接下来一个字符串,每个字符都是o
,x
,?
中的一个
输出格式:
一行一个浮点数表示答案
四舍五入到小数点后44位
如果害怕精度跪建议用long double或者extended
输入输出样例
说明
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 ",f[n-1]); return 0; }
本来
我写的scanf
于是毫无疑问的wa了
我还一脸懵
后来才发现
循环出现了很大的问题
然而
在我发现循环有问题之前
我曾一度坚定不移的怀疑是不是自己的滚动数组写错了
唉,太傻了太傻了
循环输入字符串中的单个字符不能用scanf!!!!!
用cin
在循环一个个字符!!!!!!!