贪心:旅行家的预算

问题描述
  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
  第一行为4个实数D1、C、D2、P与一个非负整数N;
  接下来N行,每行两个实数Di、Pi。
输出格式
  如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
样例输入
275.6 11.9 27.4 2.8 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\n",res);
66     system("pause");
67     return 0;
68 }

 

 
posted @ 2020-04-21 10:16  Xxaj5  阅读(241)  评论(0编辑  收藏  举报