#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <string.h> #include <cstdio> using namespace std; const int inf = 99999999; struct station { double price, dis; }; bool cmp1(station a, station b) { return a.dis < b.dis; } int main() { double cmax, d, davg; int n; scanf("%lf%lf%lf%d", &cmax, &d, &davg, &n); vector<station> sta(n + 1); sta[0] = { 0.0, d }; for (int i = 1; i <= n; i++) scanf("%lf%lf", &sta[i].price, &sta[i].dis); sort(sta.begin(), sta.end(), cmp1); double nowdis = 0.0, maxdis = 0.0, nowprice = 0.0, totalPrice = 0.0, leftdis = 0.0; if (sta[0].dis != 0) { printf("The maximum travel distance = 0.00"); return 0; } else { nowprice = sta[0].price; } int i = 1; while (nowdis < d) {//nowdis mean that distance before the nowdis, price is certain maxdis = nowdis + cmax * davg; double minPriceDis = 0, minPrice = inf; int flag = 0; for (; i <= n && sta[i].dis <= maxdis; i++) { if (sta[i].price < nowprice) {//if in,add the last dis to totalprice totalPrice += (sta[i].dis - nowdis - leftdis) * nowprice / davg; leftdis = 0.0; nowprice = sta[i].price; nowdis = sta[i].dis; flag = 1; i++; break;//jump out the "for" loop } if (sta[i].price < minPrice) { minPrice = sta[i].price; minPriceDis = sta[i].dis; } } //to calculate that maximum distance if (flag == 0 && minPrice != inf) { totalPrice += (nowprice * (cmax - leftdis / davg)); leftdis = cmax * davg - (minPriceDis - nowdis);//leftdis mean fill the tank with the cheapestPrice ,the distance out the minPricedis nowprice = minPrice; nowdis = minPriceDis; } if (flag == 0 && minPrice == inf) { nowdis += cmax * davg; printf("The maximum travel distance = %.2f", nowdis); return 0; } } printf("%.2f", totalPrice); return 0; }