题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1 、汽车油箱的容量 C (以升为单位)、每升汽油能行驶的距离 D2 、出发点每升汽油价格 P 和沿途油站数 N ( N 可以为零),油站 i 离出发点的距离 Di、每升汽油价格 Pi( i=1,2,…,Ni=1,2,…,N )。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出格式
输入格式:
第一行, D1 , C, D2 , P , N 。
接下来有 N 行。
第 i+1行,两个数字,油站i离出发点的距离 Di 和每升汽油价格 Pi 。
输出格式:
所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例
说明
N≤6 ,其余数字≤500
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include <string> 5 #include <algorithm> 6 #include<map> 7 using namespace std; 8 9 double dist, cont, m_l, p_st; 10 int n; 11 struct node { 12 double di, pi; 13 int next; 14 bool operator<(node n) { 15 return di < n.di; 16 } 17 }jyz[10]; 18 19 int main() 20 { 21 scanf("%lf%lf%lf%lf%d", &dist, &cont, &m_l, &p_st, &n); 22 for (int i = 1; i <= n; i++) { 23 double di, pi; 24 scanf("%lf%lf", &di, &pi); 25 jyz[i].di = di, jyz[i].pi = pi; 26 } 27 sort(jyz + 1, jyz + n+1); 28 jyz[0].di = 0, jyz[0].pi = p_st; 29 jyz[n + 1].di = dist,jyz[n+1].pi=0; 30 for (int i = 0; i <= n; i++) { 31 jyz[i].next = n+1; 32 for (int j = i + 1; j <= n; j++) 33 if (jyz[i].pi > jyz[j].pi) { 34 jyz[i].next = j; 35 break; 36 } 37 } 38 double oil=0,mon=0; 39 for (int i = 0; i <= n; i++) { 40 if (i > 0) 41 { 42 double disvisited = jyz[i].di - jyz[i - 1].di; 43 double oilused = disvisited / m_l; 44 oil -= oilused; 45 if (oil < 0) { 46 printf("No Solution "); 47 return 0; 48 } 49 } 50 double gap = jyz[jyz[i].next].di - jyz[i].di; 51 double oilneed = gap / m_l-oil; 52 if (oilneed <= 0) 53 continue; 54 if (oilneed + oil >= cont) { 55 double plus = cont - oil; 56 mon += plus * jyz[i].pi; 57 oil = cont; 58 } 59 else { 60 mon += oilneed * jyz[i].pi; 61 oil += oilneed; 62 } 63 } 64 printf("%.2f ", mon); 65 return 0; 66 }
思路:
就是贪心,在每个加油站都尽量加油到可以撑到下一个更便宜的那个加油站(或者终点)的程度。