With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Diferent gas station may give diferent price. You are asked to carefully design the cheapest route to go.
Input Specification:
Each input file contains one test case. For each case, the first line contains 4 positive numbers: Cmax (<=100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=20), the average distance per unit gas that the car can run; and N (<= 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,…N. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print “The maximum travel distance = X” where X is the maximum possible distance the car can run, accurate up to 2 decimal places.
Sample Input 1:
50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300
Sample Output 1:
749.17
Sample Input 2:
50 1300 12 2
7.10 0
7.00 600
Sample Output 2:
The maximum travel distance = 1200.00
从初始地到目的地,已知沿途高速各加油站价格,找出最省钱的加油方式
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;
const double inf = 99999999;
struct station {
double d; // distance
double p; // price
};
bool cmp(station &s1,station &s2) {
return s1.d<s2.d;
}
int main(int argc, char * argv[]) {
double CM,D,DA;
int N;
scanf("%lf %lf %lf %d",&CM,&D,&DA,&N);
vector<station> vss(N+1);
for(int i=0; i<N; i++) {
scanf("%lf %lf", &vss[i].p, &vss[i].d);
}
vss[N].d=D,vss[N].p=0.0; //哨兵
sort(vss.begin(),vss.end(),cmp); //按照距离排序
if(vss[0].d!=0) {
//起始油箱空,并且起始位置没有加油站
printf("The maximum travel distance = 0.00"); //注意是0.00,而不是0,否则第三个测试点错误
return 0;
}
double nowd=0.0,nowp=vss[0].p,fd=0.0,ap=0.0; //ap总费用;fd到站油箱剩余油可行驶路程
double SM = CM*DA; //一箱油可行驶路程
while(nowd<D) {
int maxd=nowd+SM; // 当前邮箱加满可行驶的最远距离
double minp=inf,mind=0.0;
bool flag = false;
for(int i=0; i<=N&&vss[i].d<=maxd; i++) {
if(vss[i].d<=nowd)continue;
if(vss[i].p<nowp) {
ap+=(vss[i].d-nowd-fd)*nowp/DA;
nowd=vss[i].d;
nowp=vss[i].p;
fd=0.0; //加的油刚好到最低价的油站
flag = true;
break;
}
if(minp>vss[i].p) {
minp=vss[i].p;
mind=vss[i].d;
}
}
if(!flag&&minp!=inf) { // 之后的站没有比当前站价格更便宜,取后面站中最低价的站C
//因为当前站价格更低,装满油箱,行驶到C站,再加油
ap+=((CM-fd/DA)*nowp);
fd=SM-(mind-nowd);
nowd=mind;
nowp=minp;
}
if(!flag&&minp==inf) { // 即使油箱满油,也不足以行驶到下一站
printf("The maximum travel distance = %.2f", nowd+SM);
return 0;
}
}
printf("%.2f", ap);
return 0;
}
PAT Advanced 1033 To Fill or Not to Fill (25) [贪?算法]
原文:https://www.cnblogs.com/houzm/p/12242952.html