| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 83020 | sh25_zhuhy | 旅行家的预算 | C++ | 通过 | 0 MS | 256 KB | 2846 | 2026-01-18 21:55:38 |
#include <iostream> #include <vector> #include <algorithm> #include <iomanip> using namespace std; struct Station { double dist; // 距离起点的距离 double price; // 油价 }; bool cmp(const Station& a, const Station& b) { return a.dist < b.dist; } int main() { double D1, C, D2, P; int N; cin >> D1 >> C >> D2 >> P >> N; vector<Station> stations(N + 2); // 包括起点和终点 stations[0] = {0.0, P}; // 起点 for (int i = 1; i <= N; i++) { cin >> stations[i].dist >> stations[i].price; } stations[N + 1] = {D1, 0.0}; // 终点,油价为0(不需要加油) sort(stations.begin(), stations.end(), cmp); double maxDist = C * D2; // 满油最大行驶距离 // 检查是否有可能到达 for (int i = 0; i <= N; i++) { if (stations[i + 1].dist - stations[i].dist > maxDist) { cout << "No Solution" << endl; return 0; } } double totalCost = 0.0; double curOil = 0.0; // 当前油量(升) int curPos = 0; // 当前所在站点索引 while (curPos < N + 1) { int nextStation = -1; // 在可达范围内寻找第一个油价低于当前站的加油站 for (int i = curPos + 1; i <= N + 1 && stations[i].dist - stations[curPos].dist <= maxDist; i++) { if (stations[i].price < stations[curPos].price) { nextStation = i; break; } } if (nextStation != -1) { // 有更便宜的加油站,只加到刚好能到达那里 double needOil = (stations[nextStation].dist - stations[curPos].dist) / D2; if (curOil < needOil) { totalCost += (needOil - curOil) * stations[curPos].price; curOil = needOil; } curOil -= needOil; // 行驶消耗 curPos = nextStation; } else { // 可达范围内没有更便宜的加油站 // 找到可达范围内油价最低的站(即使比当前贵) int minPricePos = curPos + 1; for (int i = curPos + 2; i <= N + 1 && stations[i].dist - stations[curPos].dist <= maxDist; i++) { if (stations[i].price < stations[minPricePos].price) { minPricePos = i; } } // 在当前站加满油 totalCost += (C - curOil) * stations[curPos].price; curOil = C; // 行驶到那个油价最低的站 double needOil = (stations[minPricePos].dist - stations[curPos].dist) / D2; curOil -= needOil; curPos = minPricePos; } } cout << fixed << setprecision(2) << totalCost << endl; return 0; }