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的主要内容,如果未能解决你的问题,请参考以下文章