算法训练 旅行家的预算
资源限制
时间限制: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。
接下来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 #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 }
转载请标明出处