题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1033
思路分析:主要考虑的是该不该加油,该加多少油的问题
代码如下:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct gass{
float price;
int dis;
bool operator <(const gass &A) const{
if(dis<A.dis) return true;
else return false;
}
}gs[501];
int main()
{
int cmax,d,n;
float davg;
while(scanf("%d%d%f%d",&cmax,&d,&davg,&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%f%d",&gs[i].price,&gs[i].dis);
}
sort(gs,gs+n);
gs[n].dis=d;
float gprice=0;
float cgas=0;
if(gs[0].dis==0){
for(int i=0;i<n;i++){
if(gs[i+1].dis-gs[i].dis>cmax*davg){
printf("The maximum travel distance = %.2f\n",gs[i].dis*1.0+cmax*davg);
break;
}
else{
if(i>0){
cgas-=(gs[i].dis-gs[i-1].dis)/davg;
}
int pos=i;
for(int j=i+1;j<n;j++){
if(gs[j].dis-gs[i].dis<=cmax*davg){
if(gs[j].price<gs[i].price){
pos=j;
break;
}
}
}
if(pos!=i){//最大距离找到便宜站点
if((gs[pos].dis-gs[i].dis)/davg<cgas){//油量足够
}
else{//油量不够
gprice+=((gs[pos].dis-gs[i].dis)/davg-cgas)*gs[i].price;
cgas=(gs[pos].dis-gs[i].dis)/davg;
}
}
else{//未找到便宜站点
if(gs[i].dis+cmax*davg>=d){
gprice+=((d-gs[i].dis)/davg-cgas)*gs[i].price;
printf("%.2f\n",gprice);
break;
}
else{
gprice+=(cmax-cgas)*gs[i].price;
cgas=cmax;
}
}
//printf("%d %d %.2f\n",i,gs[i].dis,gprice);
}
}
}
else printf("The maximum travel distance = 0.00\n");
}
return 0;
}