AtCoder 2170 Pushing Balls

題面

題意

平面上有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個序列每一位取平均值後的序列爲158,278,398,518,638,758
因此只要計算出每次序列中的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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章