专栏文章
题解: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 {
CPPint t, v;
};
bool compareBuses(const Bus& a, const Bus& b) {
CPPreturn a.v > b.v; // 按速度从快到慢排序
}
int main() {
CPPint 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 条评论,欢迎与作者交流。
正在加载评论...