【bzoj3450】Tyvj1952 Easy 期望dp

題目描述

某一天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了

輸入

第一行一個整數n,表示點擊的個數
接下來一個字符串,每個字符都是ox?中的一個

輸出

一行一個浮點數表示答案
四捨五入到小數點後4位
如果害怕精度跪建議用long double或者extended

樣例輸入

4
????

樣例輸出

4.1250

提示

n<=300000

題解:用一個L記錄當前位置末尾連續“O”的個數,對於當前這一位如果爲“X”,那麼L清爲0,如果爲“O”,這L++。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 301000
using namespace std;
double l,ans;
char s[N];
int n;
int main()
{
    int i,j,k;
    scanf("%d%s",&n,s+1);
    for(i=1;i<=n;i++)
    {
        if(s[i]=='x')l=0;
        else if(s[i]=='o')ans+=(++l)*2-1;
        else ans+=(l*2+1)*0.5,l=(l+1)*0.5;
    }
    printf("%.4lf\n",ans);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章