tyvj Easy

Easy測試

[描述 Description]spa

某一天WJMZBMR在打osu~~~可是他太弱逼了,有些地方徹底靠運氣:(
咱們來簡化一下這個遊戲的規則
    有n次點擊要作,成功了就是o,失敗了就是x,分數是按comb計算的,連續acomb就有a*a分,comb就是極大的連續o
    好比ooxxxxooooxxx,分數就是2*2+4*4=4+16=20Sevenkplus閒的慌就看他打了一盤,有些地方跟運氣無關要麼是o要麼是x,有些地方o或者x各有50%的可能性,用?號來表示。好比oo?xx就是一個可能的輸入。
    那麼WJMZBMR這場osu的指望得分是多少呢?
好比oo?xx的話,?o的話就是oooxx => 9,是x的話就是ooxxx => 4
指望天然就是(4+9)/2 =6.5blog

 

【輸入格式】 遊戲

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

 

【輸出格式】 字符串

一行一個浮點數表示答案
四捨五入到小數點後4
若是懼怕精度跪建議用long double或者extendedget

 

【樣例輸入】it

4io

????class

【樣例輸出】

4.1250

【數據範圍】

Time Limitation時限1s每一個測試點
k表示?號的個數
100%的數據 : n<=300000
70%的數據 : k<=20
40%的數據 : n<=200k<=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]);
}
相關文章
相關標籤/搜索