#include <cstdio>
#include <algorithm>
using namespace std;
struct Station{
double price;
double dis;
};
bool cmp(Station s1, Station s2){
return s1.dis < s2.dis;
}
int main(){
int num;
double unit, sumdis, maxcap;
scanf("%lf %lf %lf %d", &maxcap, &sumdis, &unit, &num);
Station s[num+1];
for(int i=0; i<num; i++){
scanf("%lf %lf", &s[i].price, &s[i].dis);
}
sort(s, s+num, cmp);
s[num].dis = sumdis;
s[num].price = 0;
// for(int i=0; i<num; i++){
// printf("%.2f %.0f\n", s[i].price, s[i].dis);
// }
if(s[0].dis != 0){
printf("The maximum travel distance = 0.00");
return 0;
}
double maxdis = maxcap * unit;
int k;
int now = 0;
double minprice;
double sum = 0;
double gas = 0;
while(now < num){
k = -1;
minprice = 100000000;
for(int i=now+1; i<=num && s[i].dis-s[now].dis<=maxdis; i++){
if(s[i].price <= minprice){
minprice = s[i].price;
k = i;
}
if(s[i].price <= s[now].price){
k = i;
break;
}
}
if(k == -1) break;
double need = (s[k].dis-s[now].dis) / unit;
if(s[k].price <= s[now].price){
if(gas < need){
sum += (need-gas) * s[now].price;
gas = 0;
}else{
gas -= need;
}
}else{
sum += (maxcap-gas) * s[now].price;
gas = maxcap - need;
}
now = k;
}
if(num == now){
printf("%.2f", sum);
}else{
printf("The maximum travel distance = %.2f", s[now].dis+maxdis);
}
return 0;
}
细节很多的一题,我自己写的只能得13分。
看了书上的思路后自己码了一遍。