题解 AT2170 【Pushing Balls】
戳我= ̄ω ̄=
我们来到操场的沙坑上,赶走在练习跳远的人,然后挖四个坑,然后找体育组借三个实心球放在四个坑直接,那么这些物品两两的初始距离是:
考虑一下不同的推球方法,当一个球进入一个坑后,就默不作声地用沙子将这个球埋起来,假装什么都没有发生过,将这些球重新编号。你会发现物品两两间距离有这么几种可能(表格头的编号是重编过的):
| 情况 | 坑1与球1 | 球1与坑2 | 坑2与球2 | 球2与坑3 |
|---|---|---|---|---|
| 球1入坑1 | ||||
| 球1入坑2 | ||||
| 球2入坑2 | ||||
| 球2入坑3 | ||||
| 球3入坑3 | ||||
| 球3入坑4 | ||||
| 期望 |
哇,好神奇啊,期望的物品间距离居然还是个等差数列~
你会对这个发现感到异常惊奇,但还是不要忘了把实心球挖出来还回去。
现在来观察,等差数列的第一项就是我们表格的坑1与球1这一列,你会发现不管初始用几个球,这一列只有前两行是
这样我们做
oh,对,至于每种局面下的推球期望距离,应该是
#include<bits/stdc++.h>
using namespace std;
#define RI register int
typedef double db;
int n;db d,x,ans;
int main()
{
scanf("%d%lf%lf",&n,&d,&x);
db nn=n+n;
for(RI i=n;i>=1;--i) {
ans+=d+(nn-1)/2*x;
db dd=d+(2*d+5*x)/nn;
db xx=x+4*x/nn;
x=xx,d=dd,nn-=2;
}
printf("%.10lf\n",ans);
return 0;
}