问题描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
第一行为4个实数D1、C、D2、P与一个非负整数N;
接下来N行,每行两个实数Di、Pi。
接下来N行,每行两个实数Di、Pi。
输出格式
如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
样例输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
102.0 2.9
220.0 2.2
样例输出
26.95
思路:
1.无解情况:可直接在输入时就进行判断,如果加满油即 max = capacity*driveOfEve 都小于 a[i].beginToDistance - a[i-1].beginToDistance ,那就不可能到达,直接输出 No Solution ,return0。
2.有解:寻找他能所到达范围之内(加满油: a[j].beginToDistance - a[i].beginToDistance > max )的那个最便宜的加油站
(1).如果能到达就加够刚好到那个便宜加油站的油
(2).如果没有找到,就加满油到达当前加油站的下一个加油站。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<windows.h> 4 5 using namespace std; 6 7 struct node 8 { 9 double beginToDistance; 10 double priceOfEve; 11 }; 12 13 int main() 14 { 15 node a[10]; 16 double distance,capacity,driveOfEve,beginPriceOfEve; 17 int N; 18 19 scanf("%lf %lf %lf %lf %d",&distance, &capacity, &driveOfEve, &beginPriceOfEve, &N); 20 double max = capacity*driveOfEve; //最大行驶距离 21 a[0].beginToDistance = 0; 22 a[0].priceOfEve = beginPriceOfEve; 23 a[N+1].beginToDistance = distance; 24 a[N+1].priceOfEve = 0; 25 for(int i = 1; i <= N; i++) 26 { 27 scanf("%lf %lf",&a[i].beginToDistance, &a[i].priceOfEve); 28 if(a[i].beginToDistance - a[i-1].beginToDistance > max) 29 { 30 printf("No Solution"); 31 return 0; 32 } 33 } 34 35 int j; 36 double res = 0; 37 double surplus = 0; //到第i个加油站的剩余油量 38 for(int i = 0; i <= N; i=j) 39 { 40 for(j = i+1; j <= N+1; j++) //寻找更便宜的加油站 41 { 42 if(a[j].beginToDistance - a[i].beginToDistance > max) //到不了比它便宜的加油站 43 { 44 j--; //就行驶到加满油最大距离的加油站 45 break; 46 } 47 if(a[j].priceOfEve < a[i].priceOfEve) 48 { 49 break; 50 } 51 } 52 53 if(a[j].priceOfEve <= a[i].priceOfEve) //如果找到 54 { 55 res += ((a[j].beginToDistance - a[i].beginToDistance)/driveOfEve - surplus) * a[i].priceOfEve; 56 surplus = 0; 57 } 58 else 59 { 60 res += (capacity - surplus)*a[i].priceOfEve; 61 surplus = capacity - (a[j].beginToDistance - a[i].beginToDistance)/driveOfEve; 62 } 63 } 64 65 printf("%.2lf ",res); 66 system("pause"); 67 return 0; 68 }