0922考试T1 乱搞
0925考试T1
题目大意:
有一个数轴,数轴上有\(n + 1\)艘船,给你每艘船的距离数轴上终点的距离,船身的长度和船的速度,问第1艘船(距离终点最远的那一艘)最少需要多长时间可以到终点,后面的船不可以超越前面的。
我觉得应该算是思维题吧,正解并没有什么算法。
这道题难的地方就在于每艘船速度不同,后面的船不可以超过前面的船,最多就是与前面的船速度相同,顶在前面的船的船尾。还有,假设某一艘船过了终点,但是它并不会消失,还会堵着后面的船。
我们考虑,当第一个船经过终点的时候,它肯定会与前面若干个(或没有)船连在一起,也就是说影响时间的只是那一艘堵在最前面较慢的那一艘船,后面的船都紧贴这它。我们枚举每一艘船作为堵在前面的那一艘船,假设当前船为\(x\),那么后面的所有船都跟在\(x\)的后面,我们可以把这些船看做一个大船,那么这艘大船的长度就是这些船的长度相加。这个大船的长度\(-\)第一艘船的长度\(+\)\(x\)这艘船距终点的距离就是第一艘船走的路程,\(x\)的速度就是第一艘船的速度,这样可以算出一个时间。我们把枚举的所有船的时间取个最大值就是最后答案。
#include <bits/stdc++.h>
using namespace std;
inline double read() {
double s = 0, f = 1; char ch;
while(!isdigit(ch = getchar())) (ch == '-') && (f = -f);
for(s = ch ^ 48;isdigit(ch = getchar()); s = (s * 10) + (ch ^ 48));
return s * f;
}
const int N = 1e6 + 5;
int T, n;
double ans, sum;
struct boat { double l, x, v; } a[N];
int main() {
T = read();
while(T --> 0) {
n = read(); n++;
for(int i = 1;i <= n; i++) a[i].l = read();
for(int i = 1;i <= n; i++) a[i].x = read();
for(int i = 1;i <= n; i++) a[i].v = read();
ans = sum = 0;
for(int i = 1;i <= n; i++) {
if(i != 1) sum += a[i].l;
double t = (a[i].x + sum) / a[i].v;
ans = max(ans, t);
}
printf("%.10lf\n", ans);
}
fclose(stdin); fclose(stdout);
return 0;
}