原题:http://pat.zju.edu.cn/contests/pat-practise/1033
转载:http://blog.csdn.net/hackbuteer1/article/details/7402127
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct Node
{
double price;
double length;
}node[502];
bool cmp(const Node &a,const Node &b)
{
return a.length<b.length;
}
double capacity , dist ;
int unit_gas ,n;
int main(void)
{
int i,j,m,index;
double sum,len,cur_capacity,min_price;
bool flag;
while (scanf("%lf %lf %d %d",&capacity,&dist,&unit_gas,&n)!=EOF)
{
len = capacity*unit_gas;
for (i = 0; i < n; ++i)
scanf("%lf %lf",&node[i].price,&node[i].length);
sort(node,node+n,cmp);
node[n].price = 0;
node[n].length = dist;
if(node[0].length>0)
{
printf("The maximum travel distance = 0.00\n");
continue;
}
else
{
flag = false;
cur_capacity = 0;
sum = 0;
for( i = 0 ; i < n ;)
{
if(node[i+1].length - node[i].length > len) //某两个油站之间的距离大于汽车油箱装满油量的最大行程
{
flag = true;
printf("The maximum travel distance = %.2lf\n",node[i].length + len);
break;
}
else
{
index = i;
min_price = node[i].price;
//找出当前油箱里的油能到达的所有加油站里,油价最便宜的那个
for(j = i + 1 ; node[j].length - node[i].length <= cur_capacity*unit_gas && j <= n ; j++)
{
if(node[j].price < min_price)
{
min_price = node[j].price;
index = j;
}
}
if(index != i)
{
cur_capacity -= (node[index].length - node[i].length)/unit_gas;
i = index;
continue;
}
//若找不到,找出最近的一个能到达的比当前油价便宜的站,加一些油,跑到那个站
index = i;
for(j = i + 1 ; node[j].length - node[i].length <= len && j <= n ; j++)
{
if(node[j].price < node[i].price)
{
index = j;
break;
}
}
if(index != i)
{
sum += ((node[index].length - node[i].length)/unit_gas - cur_capacity)*node[i].price;
cur_capacity = 0;
i = index;
continue;
}
//找不到比当前油站的价格还便宜的油站的时候
//在当前油站需要加满油,跑到能跑到的所有站里油价最小的那个油站
index = i;
min_price = 1e18;
for(j = i + 1 ; node[j].length - node[i].length <= len && j <= n ; j++)
{
if(node[j].price < min_price)
{
min_price = node[j].price;
index = j;
}
}
sum += (capacity-cur_capacity)*node[i].price;
cur_capacity = capacity - (node[index].length - node[i].length )/unit_gas;
i = index;
}//else
}//for
}//else
if(!flag)
printf("%.2lf\n",sum);
}
return 0;
}