#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
const int maxn = 510;
const int INF = 1000000000;
struct Station{
double price;
double dis;
}sta[maxn];
bool cmp(Station a, Station b){
return a.dis < b.dis;
}
int main(int argc, char** argv) {
int n;
double Cmax, D, Davg; //邮箱容量,距离,加油站个数
cin >> Cmax >> D >> Davg >> n;
for(int i = 0; i < n; i++){
cin >> sta[i].price >> sta[i].dis;
}
//数组最后放置终点,价格为 0,终点距离为D
sta[n].dis = D;
sta[n].price = 0;
sort(sta, sta+n, cmp);
//如果排序后的第一个加油站的距离不是0,说明无法前进。
if(sta[0].dis != 0){
cout << "The maximum travel distance = 0.00";
} else{
//当前所处的加油站编号
int now = 0;
//总花费,当前油量,满油行驶距离
double ans = 0, nowTank = 0, MAX = Cmax * Davg;
//每次循环将选出下一次需要到达的加油站
while(now < n){
//选出当前加油站能达到范围内的第一个油价是低于当前油价的加油站
//如果没有低于当前油价的加油站,则选择最低的那个
int k = -1; //最低油价的编号
double priceMin = INF; //最低油价
for(int i = now + 1; i <= n && sta[i].dis - sta[now].dis <= MAX; i++){
if(sta[i].price < priceMin){
priceMin = sta[i].price;
k = i;
if(priceMin < sta[now].price){
break;
}
}
}
//满油状态下无法找到加油站,退出循环输出结果
if(k == -1) break;
//下面是为能找到可到达的加油站k,计算转移花费
//need为从now-k需要的油量
double need = (sta[k].dis - sta[now].dis)/Davg;
//如果加油站k的价格低于当前的油价
if(priceMin < sta[now].price){
//只购买足够到达K的油
if(nowTank < need){
//如果目前的小于需要的
ans += (need - nowTank) * sta[now].price;
//到达后,油量为0
nowTank = 0;
} else{
nowTank -= need;
}
} else {
ans += (Cmax - nowTank) * sta[now].price;
nowTank = Cmax - need;
}
now = k;
}
if(now == n){
printf("%.2f",ans);
} else {
printf("The maximum travel distance = %.2f", sta[now].dis+MAX);
}
}
return 0;
}
1033 To Fill or Not to Fill (25 分)【不会
猜你喜欢
转载自blog.csdn.net/alovelypeach/article/details/114404070
今日推荐
周排行