贪婪算法
#include<stdio.h>
#include<algorithm>
#define SIZE 501
#define INF 0x7fffffff
using std::sort;
struct gas{
double price;
int dist;
} station[SIZE];
bool cmp(const struct gas &a, const gas &b){
return a.dist < b.dist;
}
int capacity, distance, mileperunit,numofst;
double price,miles;
bool FindGas(int st, double gas){
if (fabs(distance - miles)<0.0001)
return true;
if (fabs(station[st].dist - miles)>0.0001)
return false;
if (mileperunit*capacity < station[st + 1].dist - station[st].dist){
miles += mileperunit*capacity;
return FindGas(st + 1, 0);
}
else{
int i;
bool flag = false;
for (i = st + 1; station[i].dist < distance&&station[i].dist <= capacity*mileperunit + miles;i++)
if (station[st].price > station[i].price){
flag = true;
break;
}
if (!flag){
if (station[i].dist > capacity*mileperunit + miles){
price += (capacity - gas)*station[st].price;
miles += station[i - 1].dist - station[st].dist;
gas = capacity - (station[i - 1].dist - station[st].dist)*1.0 / mileperunit;
return FindGas(i - 1, gas);
}
else if (station[i].dist >= distance){
price += ((distance - station[st].dist)*1.0 / mileperunit - gas)*station[st].price;
miles += distance - station[st].dist;
return FindGas(i, 0);
}
}
else{
price += ((station[i].dist - station[st].dist)*1.0 / mileperunit - gas)*station[st].price;
miles += station[i].dist - station[st].dist;
return FindGas(i, 0);
}
}
}
int main(){
freopen("1.in", "r", stdin);
scanf("%d%d%d%d", &capacity, &distance, &mileperunit, &numofst);
int i;
for (i = 0; i < numofst; i++)
scanf("%lf%d", &station[i].price, &station[i].dist);
station[i].dist = distance;
station[i].price = INF;
sort(station, station + numofst+1, cmp);
bool flag = FindGas(0,0);
if (flag)
printf("%.2lf\n", price);
else printf("The maximum travel distance = %.2lf\n", miles);
return 0;
}