• 算法训练 旅行家的预算


    资源限制
    时间限制: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。
    输出格式
      如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
    样例输入
    275.6 11.9 27.4 2.8 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 }
  • 相关阅读:
    协程的嵌套
    利用excl的数据源表,手动选择品牌,根据品牌自动出现品牌的品牌类型、品牌型号、单价、质量等信息。
    uniapp实现薪资区间范围选择
    html2canvas + jspdf 实现html导出pdf并加水印
    jq实现薪资区间值选择
    C/C++中的函数指针的写法
    linux系统find命令的一些使用技巧
    RunAsDate改变软件获取系统时间工具
    电子政务及安全研究报告
    数据转换位串字节数组
  • 原文地址:https://www.cnblogs.com/zq-dmhy/p/12350448.html
Copyright © 2020-2023  润新知