zoukankan      html  css  js  c++  java
  • 贪心:旅行家的预算

    问题描述
      一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离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.无解情况:可直接在输入时就进行判断,如果加满油即 max = capacity*driveOfEve 都小于 a[i].beginToDistance - a[i-1].beginToDistance ,那就不可能到达,直接输出 No Solution ,return0。
    2.有解:寻找他能所到达范围之内(加满油: a[j].beginToDistance - a[i].beginToDistance > max )的那个最便宜的加油站
    (1).如果能到达就加够刚好到那个便宜加油站的油
    (2).如果没有找到,就加满油到达当前加油站的下一个加油站。
    代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<windows.h>
     4 
     5 using namespace std;
     6 
     7 struct node
     8 {
     9     double beginToDistance;
    10     double priceOfEve;
    11 };
    12 
    13 int main()
    14 {
    15     node a[10];
    16     double distance,capacity,driveOfEve,beginPriceOfEve;
    17     int N;
    18 
    19     scanf("%lf %lf %lf %lf %d",&distance, &capacity, &driveOfEve, &beginPriceOfEve, &N);
    20     double max = capacity*driveOfEve;  //最大行驶距离
    21     a[0].beginToDistance = 0;
    22     a[0].priceOfEve = beginPriceOfEve;
    23     a[N+1].beginToDistance = distance;
    24     a[N+1].priceOfEve = 0;
    25     for(int i = 1; i <= N; i++)
    26     {
    27         scanf("%lf %lf",&a[i].beginToDistance, &a[i].priceOfEve);
    28         if(a[i].beginToDistance - a[i-1].beginToDistance > max)
    29         {
    30             printf("No Solution");
    31             return 0;
    32         }
    33     }
    34 
    35     int j;
    36     double res = 0;
    37     double surplus = 0;  //到第i个加油站的剩余油量
    38     for(int i = 0; i <= N; i=j)
    39     {
    40         for(j = i+1; j <= N+1; j++)  //寻找更便宜的加油站
    41         {
    42             if(a[j].beginToDistance - a[i].beginToDistance > max)  //到不了比它便宜的加油站
    43             { 
    44                 j--;  //就行驶到加满油最大距离的加油站
    45                 break;
    46             }
    47             if(a[j].priceOfEve < a[i].priceOfEve)
    48             {
    49                 break;
    50             }
    51         }
    52  
    53         if(a[j].priceOfEve <= a[i].priceOfEve)  //如果找到
    54         {
    55             res += ((a[j].beginToDistance - a[i].beginToDistance)/driveOfEve - surplus) * a[i].priceOfEve;
    56             surplus = 0;
    57         }
    58         else
    59         {
    60             res += (capacity - surplus)*a[i].priceOfEve;
    61             surplus = capacity - (a[j].beginToDistance - a[i].beginToDistance)/driveOfEve;
    62         }
    63     }
    64     
    65     printf("%.2lf
    ",res);
    66     system("pause");
    67     return 0;
    68 }
     
  • 相关阅读:
    仿360拖拽
    js 鼠标拖拽元素移动
    js 随机生成颜色
    vue多视图
    vue 全局组件的注册
    一键分享到QQ空间、QQ好友、新浪微博、微信代码
    vuex如何管理需要即时更新的全局变量
    js检测是哪个浏览器
    for in,Object.keys()与for of的用法与区别
    js三元运算符
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12742727.html
Copyright © 2011-2022 走看看