AtCoder Grand Contest 007C

Posted acmsn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Grand Contest 007C相关的知识,希望对你有一定的参考价值。

题目链接

题意(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;
}

以上是关于AtCoder Grand Contest 007C的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Grand Contest 007C

markdown AtCoder Grand Contest 016

AtCoder Grand Contest 005

AtCoder Grand Contest 006

AtCoder Grand Contest 008 题解

AtCoder Grand Contest 025 Problem D