算法训练 旅行家的预算

0
7

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离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 #include <iostream>
 2 #include <vector>
 3 #include <iomanip>
 4 using namespace std;
 5 //zq
 6 int main() {
 7     double D1,C,D2,P,sum=0,tank;
 8     int N,flag=1;
 9     vector<double>Di,Pi;
10     cin>>D1>>C>>D2>>P>>N;
11     tank=C;
12     Di.push_back(0);
13     Pi.push_back(P);
14     for (int i=1; i<=N; ++i) {
15         double tmpD,tmpP;
16         cin>>tmpD>>tmpP;
17         Di.push_back(tmpD);
18         Pi.push_back(tmpP);
19     }
20     Di.push_back(D1);
21     Pi.push_back(0);
22     double p0 = Pi[0];
23     sum += tank * Pi[0];
24     double distance,need;
25     for (int i=1; i<N+2; ++i) {
26         distance = Di[i] - Di[i-1];
27         need = distance /D2;
28         if (tank * D2 >= distance) {
29             tank -= need;
30             if (Pi[i] < p0) {
31                 sum -= tank * p0;
32                 tank = C;
33                 sum += tank * Pi[i];
34                 p0 = Pi[i];
35             } else{
36                 if (tank * D2 < (Di[i+1] - Di[i])) {
37                     sum += (C-tank)*Pi[i];
38                     tank = C;
39                     p0 = Pi[i]; 
40                 }
41             }
42         } else{
43             cout<<"No Solution"<<endl;
44             flag = 0;
45             break;
46         }
47     }
48     if (flag!=0) {
49         cout<<fixed<<setprecision(2)<<sum;
50     }
51     return 0;
52 }

<

发布回复

请输入评论!
请输入你的名字