zoukankan      html  css  js  c++  java
  • JZOJ 3468 OSU!题解

    题目大意

    一共有 (n) 次操作,每次操作只有成功与失败之分,成功对应 (1),失败对应 (0)(n) 次操作对应为 (1) 个长度为 (n)(01)串。在这个串中连续的 (x)(1) 可以贡献 (x^3) 的分数,这 (x)(1) 不能被其他连续的 (1) 所包含(也就是极长的一串 (1),具体见样例解释)
    现在给出 (n),以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留 (1) 位小数。

    输入格式

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

    输出格式

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

    样例输入

    3
    0.5
    0.5
    0.5

    样例输出

    6.0

    数据范围与提示

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

    分析

    • 我们先考虑一个简单的问题,如果连续 (X)(1) 贡献的分数为 (X) 要怎么处理?其实很简单,我们考虑每多一个 (1) 最结果的贡献,这里因为连续长度从 (x) 增加到 (x+1),得分也是加 (1),而第 (i) 位为 (1) 的概率为 (p_i),那么真正的贡献为 (p_i),其实就是每个位置选取 (1) 的概率之和。
    • 那么对与本题贡献值为 (x^3) 来说,也可以用同样的方法来考虑,设长度为 (i)(01) 串的期望得分为 (h[i]),那么 (h[i+1]) 怎么求?
      我们同样可以考虑增加一位对结果的贡献:
      • 如果该位为 (0),肯定贡献为 (0)
      • 如果该位为 (1),那么这个 (1) 就要接在到第 (i) 位结尾连续的 (x)(1) 的后面,变成长度为 (x+1) 的连续的 (1) 串,那么此时第 (i+1) 位上对结果的贡献为 (Delta=(x+1)^3-x^3=3x^2+3x+1)
        最终的分数就是把每个 (1) 的贡献累加起来。因为第 (i) 位为 (1) 是有概率的,为 (p_i),所以它真正对分数之和的贡献为 (Delta imes p_i)。因此我们可以得到一个递推式 (h[i+1]=h[i]+Delta imes p_i)。因为 (Delta) 里面的 (x) 对应的是 (01) 串前 (i) 位结尾的连续 (1) 的长度的期望(可以理解为前 (i) 位的结尾 (01) 串的平均长度),所以我们还需要定义:
    • (f2[i]) 表示前 (i) 为结尾连续 (1) 的长度的平方的期望
    • (f1[i]) 表示前 (i) 为结尾连续 (1) 的长度的期望
      其中,(f1[i+1]) 我们可以这样理解,前 (i) 位结尾连续 (1) 的平均长度为 (f1[i]),那么第 (i+1) 位有两种可能:
    • (0),那么此时连续 (1) 结尾长度为 (0),概率为 (1-p_{i+1})
    • (1),那么此时连续 (1) 结尾长度为 (f[i]+1),概率为 (p_{i+1})
      所以 (f1[i+1]=0 imes (1-p_{i+1})+(f1[i]+1) imes p_{i+1}=(f1[i]+1) imes p_{i+1})

    再看 (f2),因为 ((x+1)^2=x^2+2x+1),所以对于平方来说,当长度增加 (1),实际增加量为 (2x+1)。如果放到 (f2[i+1]) 中,这里的 (x) 就对应前 (i) 位的结尾连续 (1) 的长度的期望,即 (f1[i])
    因此,类似于上面的 (f1) 的求法,(f2[i+1]=0 imes (1-p_{i+1})+(f2[i]+2f1[i]+1) imes p_{i+1}=(f2[i]+2f1[i]+1) imes p_{i+1})

    综上所述,我们得到完整的递推式:

    [egin{aligned} h[i]&=h[i-1]+(3f2[i]+3f1[i]+1) imes p_i\ f2[i]&=(f2[i-1]+2f1[i-1]+1) imes p_i\ f1[i]&=(f1[i-1]+1) imes p_i\ end{aligned} ]

    根据这三个递推式,我们可以解决这道题了,代码很简单,略了。另外可以自己手模一下简单例子,看看是否跟上面的递推式一致

  • 相关阅读:
    代码抄袭检测系统的设计和实现(1)--需求分析和基础架构
    Protobuf C/C++实战笔记(1)
    自动构建Makefile(1)--C/C++编译流程&Makefile规则简介
    初识storm
    Ubuntu 16.04LTS安装Nginx
    redis内存监控与回收
    RabbitMQ交换机规则实例
    git合并分支上指定的commit
    git忽略掉文件权限检查
    git修改文件权限方式
  • 原文地址:https://www.cnblogs.com/kuangbiaopilihu/p/13139826.html
Copyright © 2011-2022 走看看