陶陶和天天喜欢玩赛车游戏,在游戏中有一条直赛道长度为 l,陶陶的赛车在起点为 0 的位置,准备向终点行驶,天天的赛车在终点为 l 的位置,准备向起点行驶。赛车的初始速度都为 1,在赛道上有 n 个加速带,第 i 加速带的位置为 ai ,当小车经过一个加速带时,它的速度就增加 1,请你帮忙计算出两车相遇时间。
从文件 car.in 中读入数据。
第一行仅有一个整数 T 表示测试数据的组数,每组测试数据的第一行包含两个整数 n 和 l,第二行包含 n 个整数 a1,a2,a3,⋯,an 。
输出到文件 car.out 中。
共有 T 行,每行仅有一个数,依次对应每组测试数据的答案,表示两车相遇的时间。允许误差不超过 10−6。
5
2 10
1 9
1 10
1
5 7
1 2 3 4 6
2 1000000000
413470354 982876160
9 478
1 10 25 33 239 445 453 468 477
3.000000000000000
3.666666666666667
2.047619047619048
329737645.750000000000000
53.700000000000000
数据范围限制 对于 100% 的数据:
1≤T≤104,1≤n≤105,1≤l≤109,1≤a1<a2<⋯<an<l 保证所有测试用例中n的总和不超过105#include<bits/stdc++.h>
using namespace std;
int t,l,n;
double a[100005];
int main() {
freopen("car.in","r",stdin);
freopen("car.out","w",stdout);
cin>>t;
while(t--) {
scanf("%d%d",&n,&l);
for(int i=1; i<=n; i++) {
scanf("%lf",&a[i]);
}
double ans=0,p1=0,p2=l,p1_s=1,p2_s=1;
int p1_n=1,p2_n=n;
while(p2-p1>=1e-7) {
double t1=(a[p1_n]-p1)/p1_s;
double t2=(p2-a[p2_n])/p2_s;
if(t2<t1) {
p2-=p2_s*t2;
p1+=p1_s*t2;
p2_s++,p2_n--;
ans+=t2;
} else {
p1+=p1_s*t1;
p2-=p2_s*t1;
p1_s++,p1_n++;
ans+=t1;
}
}
printf("%.15lf\n",ans+(p2-p1)/(p1_s+p2_s));
}
return 0;
}
2个点RE,8个点误差大,求调,玄关