BZOJ3450 Tyvj1952 Easy

来源:互联网 发布:golang defer func 编辑:程序博客网 时间:2024/05/21 17:09

f[i]表示前i次操作,结尾最长连续1的期望,g[i]表示前i次操作的答案

p表示这次为1的概率

f[i]=p*(f[i-1]+1)+(1-p)*0

g[i]=(1-p)*g[i-1]+p*(g[i-1]-f[i-1]^2+(f[i-1]+1)^2)

化简得

f[i]=p*(f[i-1]+1);
g[i]=g[i-1]+p*(2*f[i-1]+1);

并不需要long double -_-

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<queue>#include<map>#include<bitset>#include<stack>#include<vector>#include<set>using namespace std;#define MAXN 300010#define MAXM 1010#define INF 1000000000#define MOD 1000000007#define ll long long#define eps 1e-8int n;char s[MAXN];double f[MAXN],g[MAXN];int main(){int i;scanf("%d%s",&n,s+1);for(i=1;i<=n;i++){double p;if(s[i]=='o'){p=1;}if(s[i]=='x'){p=0;}if(s[i]=='?'){p=0.5;}f[i]=p*(f[i-1]+1);g[i]=g[i-1]+p*(2*f[i-1]+1);}printf("%.4lf\n",g[n]);return 0;}/**/


0 0
原创粉丝点击