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;
}
posted @ 2020-09-25 20:01  C锥  阅读(85)  评论(0编辑  收藏  举报