这道题适合用贪心算法做,看完题就觉得很复杂,不知道该从哪入手,参考了相关资料后,发现先按距离排序然后一步步计算就可以得出答案,但过程仍然有些复杂,具体可参见代码中的注释。实现算法的过程中很容易出错,关键就在nowTank的值何时变化,怎么变化。
using namespace std;
#include<bits/stdc++.h>
struct node{
double dis;
double price;
};
bool cmp(node a,node b){
return a.dis<b.dis;
}
int main(){
int n,i;
double cmax,d,davg;
node a[501];
scanf("%lf %lf %lf %d",&cmax,&d,&davg,&n);
for(i=0;i<n;i++){
scanf("%lf %lf",&a[i].price,&a[i].dis);
}
a[n].price=0;
a[n].dis=d;
sort(a,a+n,cmp);
if(a[0].dis != 0){//step 1
printf("The maximum travel distance = 0.00");
return 0;
}
int now=0;
double ans=0,nowTank=0,MAX=cmax*davg;
while(now<n){
int k=-1;
double priceMin=1e9;
//step 2
for(i=now+1;i<=n && a[i].dis-a[now].dis<=MAX;i++){
if(a[i].price < priceMin){
priceMin=a[i].price;
k=i;
if(priceMin < a[now].price){
break;
}
}
}
//case 3
if(k == -1){
printf("The maximum travel distance = %.2f",a[now].dis+MAX);
break;
}
else{//case 1 or 2
double tmp;
tmp=(a[k].dis-a[now].dis)/davg;
if(priceMin < a[now].price){//case 1
if(nowTank<tmp){
ans+=(tmp-nowTank)*a[now].price;
nowTank=0;//到达k处剩余油量
}
else{
nowTank-=tmp;
}
}
else{//case 2
ans+=(cmax-nowTank)*a[now].price;
nowTank=cmax-tmp;//到达k处剩余油量
}
now=k;
}
}
if(now == n) printf("%.2f",ans);
return 0;
}