洛谷 P1365 WJMZBMR打osu! / Easy 做題記錄

coding_goat_qwq發表於2024-11-15

\(len\) 表示當前的期望連擊數,設 \(ans\) 為當前的答案,我們分類討論來更新 \(ans\)

  • 當現在打到了這個音符,那麼 \(ans \to ans+(len+1)^2-len^2 = ans+len\times 2+1\)
  • 當現在沒打到這個音符,那麼 \(ans\) 不變。
  • 當現在不知道打沒打到,那麼 \(ans \to ans+\frac{(len\times 2 + 1 )+ 0}{2} = len+0.5\)

對於 \(len\) 我們依舊分類討論:

  • 當現在打到了這個音符,那麼 \(len \to len+1\)
  • 當現在沒打到這個音符,那麼 \(len \to 0\)
  • 當不知道打沒打到,根據期望的定義,\(len \to \frac{(len+1)+0}{2}=\frac{len+1}{2}\)
點選檢視程式碼
#include<bits/stdc++.h>

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();

#define ll long long
#define i128 __int128

using namespace std;
inline int read() {
	int xx= 0;int f= 1;
	char c = getchar();
	while(c<'0'||c>'9') { 
		if(c=='-') f= -1;
		c= getchar();
	}
	while(c>='0'&&c<='9') {
		xx= (xx<<1)+(xx<<3)+(c^48);
		c= getchar();
	}
	return xx*f;
}
#define maxn 200050
double len,ans;
int n;
char ch;
signed main() {
	in1(n);
	For(i,1,n) {
		char ch=getchar();
		while(ch!='x'&&ch!='?'&&ch!='o') ch=getchar();
		if(ch=='x') len=0;
		else if(ch=='o') ans+=len+len+1,len++;
		else ans+=len+0.5,len=(len+1)/2;
	}
	printf("%.4lf",ans);
}