#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <queue> using namespace std; const int maxn = 100 + 30; const int INF = 999999999; double D1; //两地之间距离 D1 double C, //汽车容量 C D2; //每升汽油能行驶的距离 D2 double P; //出发点汽油价格 double D[maxn]; //经过的加油站到起点的距离 double Px[maxn]; //经过的加油站的费用 double ans; //最后的价格 int N; //沿途加油站个数 double rest[maxn]; //剩余 void solve(); void input(); //输入数据 void input() { cin >> D1 >> C >> D2 >> P >> N; for (int i = 1; i <= N; i++) { cin >> D[i] >> Px[i]; rest[i] = C; } } void solve() { //输入数据 input(); //一开始肯定要加汽油 D[N + 1] = D1; // 为了写起来方便,将终点也认为是加油站, 离起点 D1距离 Px[N + 1] = INF; // 终点了嘛,所以需要价格 0 Px[0] = P; //起点处的 价格 rest[0] = C; //起点设置为 C int minx = 0; // minx: 当前价格最低的汽油站 for (int i = 1; i <= N+1; i++) { //接下来要前进的距离 double need = (D[i] - D[i - 1]) / D2; //接下来要前进的距离所需要的汽油量 if (need > C) { //所需要的汽油量 大于 最大的容量,显然应该No Solution了 cout << "No Solution\n"; return; } //总是选择当前价格最小的加油站 if (Px[minx] <= Px[i - 1]) { if (need <= rest[minx]) { rest[minx] -= need; ans += need * Px[minx]; } else { need -= rest[minx]; ans += rest[minx] * Px[minx]; minx = i - 1; //因为need > 当前最小价格的加油站,所以还需要加上前一个的加油站汽油 rest[minx] -= need; ans += need * Px[minx]; } } else { minx = i - 1; rest[minx] -= need; ans += need * Px[minx]; } } printf("%.2lf\n", ans); } int main() { solve(); return 0; }
时间: 2024-10-06 00:53:26