• 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
    ");
    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 }
    View Code

    思路

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

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    【C#】Color颜色对照表
    eslint的实践
    关于babel和webpack结合使用的实践
    前端学习博客
    css学习4--网格布局
    css学习3--flexbox布局
    CSS学习2-布局介绍
    css学习1
    前端性能优化
    line-height介绍
  • 原文地址:https://www.cnblogs.com/yalphait/p/9402614.html
Copyright © 2020-2023  润新知