Codeforces Round #146 (Div. 2)--D. Let's Play Osu!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_37868325/article/details/98261379

http://codeforces.com/contest/236/problem/D

题意,一个由xo组成的字符串,连续的o的个数的平方算入权值,长度为n的序列,给出每个字符为o的概率,求所有序列的权值的期望。

思路:

对于任何一个o,相对于所在的序列,会有自己固定的权值

首先要知道(a+1)^2=a^2+2*a+1

例如:对于五个o的价值是5*5=25,

那么可以从第一个开始考虑,

第一个o价值是1

第二个o相当于对于一个o的序列加上了一个o,即增加的价值为(1+1)^2-1^2=1*2+1=3

第三个o相当于对于两个o的序列加上了一个o,即增加的价值为(2+1)^2-2^2=2*2+1=5

第四个o……,增加的价值为3*2+1=7

第五个o……,增加的价值为4*2+1=9

总计是25,所以可以看出可行!

再用到的一个知识点就是概率加权,学过概率还是很好理解的,就是要把o出现的概率加上,就可以算出前面连续出现的o的个数

跟着上面结合,一步步推出来,带上p,提个公因式即可~

#include<bits/stdc++.h>
using namespace std;
double p[100005];
double ans,a;
int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%lf",&p[i]);
    ans=p[1];
    a=1;
    for(int i=2;i<=n;i++)
    {
        ans+=p[i]*(p[i-1]*(a*2+1)+(1-p[i-1]));
        a=p[i-1]*(a+1)+(1-p[i-1]);
    }
    printf("%.15f\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/98261379