站外题求助,玄关
  • 板块学术版
  • 楼主blue7628_N2O
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/12/13 16:02
  • 上次更新2024/12/13 20:49:57
查看原帖
站外题求助,玄关
1019873
blue7628_N2O楼主2024/12/13 16:02

题目描述

陶陶和天天喜欢玩赛车游戏,在游戏中有一条直赛道长度为 l,陶陶的赛车在起点为 0 的位置,准备向终点行驶,天天的赛车在终点为 l 的位置,准备向起点行驶。赛车的初始速度都为 1,在赛道上有 n 个加速带,第 i 加速带的位置为 ai ,当小车经过一个加速带时,它的速度就增加 1,请你帮忙计算出两车相遇时间。

输入

从文件 car.in 中读入数据。

第一行仅有一个整数 T 表示测试数据的组数,每组测试数据的第一行包含两个整数 n 和 l,第二行包含 n 个整数 a1,a2,a3,⋯,an 。

输出

输出到文件 car.out 中。

共有 T 行,每行仅有一个数,依次对应每组测试数据的答案,表示两车相遇的时间。允许误差不超过 10610^{-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% 的数据:

1T104,1n105,1l109,1a1<a2<<an<l1 \leq T \leq 10^4,1 \leq n \leq 10^5,1 \leq l \leq 10^9,1 \leq a_1 < a_2 < \cdots < a_n < l 保证所有测试用例中n的总和不超过105保证所有测试用例中 n 的总和不超过 10^5
#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个点误差大,求调,玄关

2024/12/13 16:02
加载中...