码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj 4318]OSU!

时间:2017-09-21 11:31:01      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:bzoj   sum   成功   name   jpg   scanf   连续   分享   com   

题目:

一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串。在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含。 现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。 
 
又是概率题,没错,今天都在刷这个。信息学里刷数学果然有一种畅快感233。
现在我们来分(kou)析(hu)一波:
长度x的连续子串的下一位为1,对答案的贡献是\({(x + 1)^3} - {x^3} = 3{x^2} + 3x + 1\)。
于是维护\(x\)和\({x^2}\)的期望\({E}(x)\)和\({E}({x^2})\)即可。
但是维护时注意,\({E}({x^2})\)不等同于\({E}{(x)^2}\),而算期望值时要用\({E}({x^2})\)
( \({\rm E}{(x)^2} = {(\sum {{p_i}{a_i}} )^2}\) , \({\rm E}({x^2}) = \sum {{p_i}a_i^2}\) ,当然不同。而原贡献中要求的是\({E}({x^2})\)。)
 
代码如下:
#include <cstdio>
using namespace std;
int main()
{
    int n;scanf("%d",&n);
    double ans,Ex,Ex2,p;
    for(int i = 1;i <= n;i++)
    {
        scanf("%lf",&p);
        ans += (3 * Ex2 + 3 * Ex + 1) * p;
        Ex2 = (Ex2 + 2 * Ex + 1) * p;
        Ex = (Ex + 1) * p;
    }
    printf("%.1lf\n",ans);
    return 0;
}

看了这代码量,我忽然觉得,这真TM是一道水题... ...

技术分享

[bzoj 4318]OSU!

标签:bzoj   sum   成功   name   jpg   scanf   连续   分享   com   

原文地址:http://www.cnblogs.com/gcc314/p/7567086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!