zoukankan      html  css  js  c++  java
  • AGC007C Pushing Balls

    题目链接

    题意(N)个坑,(N+1)个球,相间分布,距离为以(d_1)为首项,(x)为公差的等差数列。对于每次操作,随机选择一个未入坑的球,随机选择向左或向右,掉入第一个没有球的坑,定义一次操作的价值为球移动的距离。求(N)次操作的期望总价值。

    分析这是一道很好的期望题

    其实(idea)还是比较妙的。

    考虑转化问题:有(2N+1)个物品,每次随机删去相邻两个,求距离和的期望。

    然后我们发现,若干次操作后段长仍为等差数列。

    这个感性认知一下吧(能感觉到的请忽略这一段),初始时对于每个长为(d_1+kx)的段,删去两点后该段长度为(3d_1+3kx),那么所有非边界的两点删去后的长度为(3d_1, 3d_1+3x,dots,3d_1+3(2n-1)x),加上任意两点删去可能性相当,所以第一次操作后仍是等差数列。然后后面肯定也是了对吧。

    然后我们计算每一次操作后(当前有(2N)个点)的首项与公差的期望。

    首项有三种可能:

    1、删除编号为1、2的点,首项为(d_1+2x)

    2、删除编号为2、3的点,首项为(3d_1+3x)

    3、其他情况首项不变为(d_1)

    根据全期望公式得到

    (d_1^{'}=frac{1}{2n}*(d_1+2x)+frac{1}{2n}*(3d_1+3x)+frac{2n-2}{2n}*d_1)

    (=frac{(2n+2)d_1+5x}{2n})

    公差有两种可能:

    1、该段长不变为(x)

    2、该段被取走为(3x)

    (x^{'}=frac{(n+2)x}{2n})

    每次计算答案即可

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
        double n, a, x, ans=0.0;
        cin >> n >> a >> x;
        for (; n; n--)
        {
            ans+=a+(2*n-1)/2*x;
            a=((2*n+2)*a+5*x)/(2*n);
            x=(n+2)*x/n;
        }
        printf("%.10f
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    RocketMQ读书笔记3——消费者
    RocketMQ读书笔记1——简述
    02_dubbo实例_多版本号
    01_dubbo实例_服务分组
    分布式开放消息系统(RocketMQ)的原理与实践
    关于ajax的那些事
    关于html5之canvas的那些事
    关于js封装框架类库之属性操作
    关于js封装框架类库之样式操作
    关于js封装框架类库之事件模块
  • 原文地址:https://www.cnblogs.com/ACMSN/p/10165611.html
Copyright © 2011-2022 走看看