18.08.01 luogu P1016 旅行家的预算

题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 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”。

 

输入输出样例

输入样例#1: 
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出样例#1: 
26.95

说明

N6 ,其余数字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\n");
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\n", mon);
65     return 0;
66 }
View Code

思路

就是贪心,在每个加油站都尽量加油到可以撑到下一个更便宜的那个加油站(或者终点)的程度。

posted @ 2018-08-01 17:38  TobicYAL  阅读(190)  评论(0编辑  收藏  举报