題面
題意
平面上有n+1個洞,洞兩兩之間有一個球,第i個球到左邊的洞的距離爲((i*2-2)*x+d),第i個球到右邊的洞的距離爲(i*2-1)*x+d,每次隨機選擇一個不在洞中的球,再隨機選擇一個方向推動,球將會進入這個方向上距離它最近的沒有球的洞(洞裏如果有球將會跳過這個洞繼續滾動)。
現在求所有球進洞後,球滾動的期望總距離。
做法
首先球到的洞的距離是一個等差數列:d,d+x,d+2x,d+3x,d+4x……….d+(2*n-1)x.
然後可以發現經過一次操作後上述序列變短而且仍然爲等差數列,例如:
n=4,d=1,x=1時,
初始的序列爲1,2,3,4,5,6,7,8
第一次操作後一共有八種可能:
1.第一個球向左滾:3 4 5 6 7 8
2.第一個球向右滾:6 4 5 6 7 8
3.第二個球向左滾:1 9 5 6 7 8
4.第二個球向右滾:1 2 12 6 7 8
5.第三個球向左滾:1 2 3 15 7 8
6.第三個球向右滾:1 2 3 4 18 8
7.第四個球向左滾:1 2 3 4 5 21
8.第四個球向右滾:1 2 3 4 5 6
上述8個序列每一位取平均值後的序列爲
因此只要計算出每次序列中的d和x變化的規律,每次操作前答案加上該序列的平均值即可。
代碼
#include<iostream>
#include<cstdio>
#define db double
using namespace std;
int n;
db x,d,ans;
int main()
{
int i,j;
cin>>n>>d>>x;
for(;n;n--)
{
ans+=(d*2.0+(db)(2*n-1)*x)/2.0;
d+=d/(db)n+5.0*x/(db)(2*n);
x+=2.0*x/(db)n;
}
printf("%.10f",ans);
}