专栏文章

题解:P13347 「ZYZ 2025」地铁

P13347题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miotjg1a
此快照首次捕获于
2025/12/03 00:54
3 个月前
此快照最后确认于
2025/12/03 00:54
3 个月前
查看原文
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct Bus {
CPP
int t, v;
};
bool compareBuses(const Bus& a, const Bus& b) {
CPP
return a.v > b.v; // 按速度从快到慢排序
}
int main() {
CPP
int n, S, E, v0;

cin >> n >> S >> E >> v0;


vector<Bus> buses(n);

for (int i = 0; i < n; ++i) {

    cin >> buses[i].t >> buses[i].v;
    
}

// 按速度从快到慢排序
sort(buses.begin(), buses.end(), compareBuses);

double min_time = (double)(E - S) / v0; // 纯步行时间

double current_pos = S;

double current_time = 0.0;


for (const auto& bus : buses) {

    if (bus.v <= v0) continue; // 公交车不比步行快,不考虑
    
    
    // 计算小Q步行到与公交车相遇的位置和时间
    // 设相遇时间为t_meet,位置为x
    // x = bus.v * (t_meet - bus.t)
    // x = current_pos + v0 * (t_meet - current_time)
    // 解方程:
    
    double t_meet = (bus.v * bus.t + current_pos - v0 * current_time) / (bus.v - v0);
    double x = bus.v * (t_meet - bus.t);
    
    if (x < current_pos) continue; // 公交车已经开过
    
    // 更新当前位置和时间
    current_pos = x;
    current_time = t_meet;
    
    // 计算从当前位置到终点的时间
    double remaining_time = (double)(E - current_pos) / bus.v;
    double total_time = current_time + remaining_time;
    
    if (total_time < min_time) {
        min_time = total_time;
    }
}

cout << fixed << setprecision(5) << min_time << endl;
return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...