洛谷 P1365 WJMZBMR打osu! / Easy 做题记录

\(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);
}
posted @ 2024-11-15 18:30  coding_goat_qwq  阅读(3)  评论(0编辑  收藏  举报