Note
-
贪心
-
学会合理使用return 0; (尽量避免设置flag变量)
-
注意起始地没有加油站的情况!哪里也去不了!(直接输出0.00并且return 0)
Code:
#include<bits/stdc++.h>
using namespace std;
struct gas{
double price,dist;
}g[505];
bool compare(gas a,gas b){
if(a.dist!=b.dist) return a.dist<b.dist;
else return a.price<b.price;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int n;
double c,dis,avg,cost=0;
cin>>c>>dis>>avg>>n;
for(int i=0;i<n;i++)
cin>>g[i].price>>g[i].dist;
sort(g,g+n,compare);
double p=g[0].price,d=g[0].dist;
for(int i=0;i<n;i++){
if(d==g[i].dist) g[i].price=p;
p=g[i].price;
d=g[i].dist;
}
int now=0;
double cap_now=0,max=c*avg;
g[n].dist=dis;
g[n].price=0;
if(g[0].dist>0){
printf("The maximum travel distance = 0.00");
return 0;
}
for(int i=1;i<=n;i++){
if(g[i].dist-g[now].dist>max){
if(i-1==now){
printf("The maximum travel distance = %.2lf",max+g[now].dist);
return 0;
}
cost+=(max-cap_now)*g[now].price/avg;
cap_now=max-g[i-1].dist+g[now].dist;
now=i-1;
i--;
}
else{
if(g[i].price<g[now].price||g[i].dist-g[now].dist+cap_now==max){
cost+=(g[i].dist-g[now].dist-cap_now)*g[now].price/avg;
now=i;
cap_now=0;
}
}
}
printf("%.2lf",cost);
return 0;
}