zoukankan      html  css  js  c++  java
  • bzoj 4318 OSU!

    Description

    osu 是一款群众喜闻乐见的休闲软件。 
    我们可以把osu的规则简化与改编成以下的样子: 
    一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串。在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释) 
    现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。 
     
     

    Input

    第一行有一个正整数n,表示操作个数。接下去n行每行有一个[0,1]之间的实数,表示每个操作的成功率。 
     
     

    Output

    只有一个实数,表示答案。答案四舍五入后保留1位小数。 
     

    Sample Input

    3
    0.5
    0.5
    0.5

    Sample Output

    6.0

    HINT

    【样例说明】 

    000分数为0,001分数为1,010分数为1,100分数为1,101分数为2,110分数为8,011分数为8,111分数为27,总和为48,期望为48/8=6.0 

    N<=100000

      题目大意 已知一个01串的第i位为1的概率为( p_{i} ),出现x个连续的1,则对分数有( x^{3} )的贡献(不能重复进行贡献,例如11的分数为8,而不是10),问期望的分数。

      根据dp的常用套路,会考虑设( f[i][j] )表示考虑到第i位,末尾有j个1的期望分数。但是这里是求期望,期望是有线性的,所以直接考虑期望增加的分数。

      故用( f[i] )表示考虑到第i位的期望。

      1.如果第i位为0,则什么贡献都不会产生

      2.如果第i位为1,然后考虑增加的贡献,设( x )表示末尾有x个1,则有( left(x + 1 ight )^{3}-x^{3}  ),化简得到( 3x^{2} + 3x + 1 )

        设( p )表示( p_{i} ),考虑维护期望的x的值,这个很好想,直接( E_{x}' = pleft(E_{x} + 1 ight ) )。

        关键是如何维护( x^{2} )(科普,正确的对平方的期望的理解是 长度的平方 的期望,显然它不等于 期望的长度 的平方)

        考虑它的定义,设( P_{i} )表示上一位结尾有i个1的概率。根据期望的定义我们有:

    ( E_{x^{2}} = sum_{k = 0}^{i - 1}k^{2}P_{k}=0^{2}P_{0}+1^{2}P_{1}+cdots +left(i - 1 ight )^{2}P_{i-1} )

        现在考虑第i位为1,于是得到了下面这个式子:

    ( E_{x^{2}}' = pleft[0 + sum_{k = 0}^{i - 1}left ( k+1 ight )^{2}P_{k} ight] )

        用完全平方公式展开其中的平方系数:

    ( E_{x^{2}}' = pleft[0 + sum_{k = 0}^{i - 1}left ( k^{2} + 2k +1 ight )P_{k} ight] )

        继续化简得到:

    ( E_{x^{2}}' = p left( sum_{k = 0}^{i - 1} k^{2}P_{k} + 2sum_{k = 0}^{i - 1}kP_{k} + sum_{k=0}^{i-1}P_{k}  ight) )

        对比( E_{x} )的定义式( E_{x} = sum_{k = 0}^{i - 1}kP_{k} )和( E_{x^{2}} )的定义式,然后根据一下有关(P_{i})的性质可以得到:

    ( E_{x^{2}}'=pleft (E_{x^{2}} + 2E_{x} + 1  ight ) )

      
      然后一切就简单了。

      由于( f[i] )等于( f[i - 1] )加一坨乱七八糟的东西,答案在( f[n] ),所以这题根本不用数组qaq。

    Code

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef bool boolean;
     4 #define ll long long
     5 
     6 int n;
     7 double p, x = 0.0, x2 = 0.0, E = 0.0;
     8 
     9 inline void solve() {
    10     scanf("%d", &n);
    11     for(int i = 1; i <= n; i++) {
    12         scanf("%lf", &p);
    13         E += (3 * (x2 + x) + 1) * p;
    14         x2 = (x2 + 2 * x + 1) * p;
    15         x = (x + 1) * p;
    16 //        cerr << E << " " << x2 << " " << x << endl;
    17     }
    18     printf("%.1lf", E);
    19 }
    20 
    21 int main() {
    22     solve();
    23     return 0;
    24 }
  • 相关阅读:
    Mvc Tree的简单应用
    nodeJs的学习之路(1)
    AngularJs基础学习指南(1)
    前端工程化讲解
    前端性能优化--为什么DOM操作慢?
    This package contains perl-5.16.3, java8, nifi-1.1.2 on ubuntu:14.04
    This package contains sshd, pcal, mysql-client on Ubuntu14:04
    This package contains mysql-server on ubuntu:14.04
    NIFI-创建一个FlowFile并利用PutFile保存到到指定目录
    NIFI如何利用eclipse开发自己的Processor(下)
  • 原文地址:https://www.cnblogs.com/yyf0309/p/8051781.html
Copyright © 2011-2022 走看看