Easy测试
[描述 Description]spa
某一天WJMZBMR在打osu~~~可是他太弱逼了,有些地方彻底靠运气:(
咱们来简化一下这个游戏的规则
有n次点击要作,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o。
好比ooxxxxooooxxx,分数就是2*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了blog
【输入格式】 游戏
第一行一个整数n,表示点击的个数
接下来一个字符串,每一个字符都是ox?中的一个ip
【输出格式】 字符串
一行一个浮点数表示答案
四舍五入到小数点后4位
若是惧怕精度跪建议用long double或者extendedget
【样例输入】it
4io
????class
【样例输出】
4.1250
【数据范围】
Time Limitation时限1s每一个测试点
k表示?号的个数
100%的数据 : n<=300000
70%的数据 : k<=20
40%的数据 : n<=200且k<=20
又是指望o(︶︿︶)o 唉
晕了很久
果真仍是太弱了
奇迹的是最后居然过了~
后来g_word神犇提出了一种新的理解方式,真是豁然开朗啊(Orz)
个人作法是这样子的:
动规:f[i] 表明 i 的指望。T[i] 表明 最后连续的o的指望长度(g_word神犇提出的,给跪了)。
这样理解就能够当作是没有?的状况作了。
因而转移就很显然了。
对于?的话指望长度就要除以2了。不然要么+1要么=0
f的话只有碰到?或x才须要更新。
标程用了一种很是高端莫测的作法,看不懂……
UPD:忘了贴代码了
#include <cstdio> int n; long double f[300000 + 9],T[300000 + 9]; int main() { #ifndef ONLINE_JUDGE freopen("easy.in","r",stdin); freopen("easy.out","w",stdout); #endif scanf("%d\n",&n); for (int i = 1; i <= n; ++i) { char c = getchar(); if (c == 'x') { f[i] = f[i - 1]; T[i] = 0; }else if (c == 'o') { f[i] = f[i - 1] + 2*T[i - 1] + 1; T[i] = T[i - 1] + 1; }else { f[i] = f[i - 1] + T[i - 1] + 0.5; T[i] = (T[i - 1] + 1)/2; } } printf("%.4f\n",(double)f[n]); }