問題描述ui
美團外賣的配送員用變速跑的方式進行身體訓練。 他們訓練的方式是: n 我的排成一列跑步, 先後兩人之間相隔 u 米, 每一個人正常速度均爲 v 米/秒。 當某個配送員排在最後的時候, 他須要以當時本身的最高速度往前跑, 直到超過排頭的人 u 米, 而後降回到原始速度v 米/秒。 每一個人最初的最高速度爲 c(i)米/秒, 每輪衰減 d(i)米/秒, 也就是說, 若是 i是第 j 個跑的, 那麼他的速度就是 c(i)-(j-1)×d(i)米/秒。
n 我的初始以隨機的順序排列, 每種順序的機率徹底相等, 跑完一輪( 每一個人都追到排頭一次, 序列恢復原樣) 的指望須要的時間是多少?spa
輸入數據code
第一行整數 n, 實數 v , 實數 u;
第二行 n 個實數每一個人的速度 c(i);
第三行 n 個實數值每一個人衰減量 d(i);
輸入數據保證每一個人的速度不會衰減到 ≤vstring
輸出數據io
答案保留 3 位小數。class
輸入樣例美團
10 37.618 0.422
72.865 126.767 202.680 106.102 99.516 134.418 167.952 173.646 120.210
136.571
2.941 3.664 7.363 4.161 0.246 8.046 5.521 7.473 7.178 5.649sso
輸出樣例數據
0.815word
數據範圍
n≤1000,v≤100,u≤10
c(i)≤50000,d(i)≤10
輸入數據保證每一個人的速度不會衰減到≤v
題解
很水的小題,枚舉i在那個點開始,而後算指望就能夠了。
代碼以下
#include<cstdio>
using namespace std;
int n;
double v,u,c[1005],d[1005],Ans;
int main(){
scanf("%d%lf%lf",&n,&v,&u);
for(int i=1;i<=n;i++) scanf("%lf",&c[i]);
for(int i=1;i<=n;i++) scanf("%lf",&d[i]);
for(int i=1;i<=n;i++){
double Now=0;
for(int j=1;j<=n;j++) Now+=(u*(double)n)/(c[i]-d[i]*(j-1)-v);
Now/=n;Ans+=Now;
}
printf("%.3lf",Ans);
return 0;
}