• 旅行家的预算


    题目描述

    一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pii=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

    输入格式

    第一行,D1CD2PN

    接下来有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

    分析:

    说这题简单的都是大佬(当然不排除抄题解咳咳),这题告诉你精度的意义。。。算法不难,就是一个简单的贪心就完事了。。。

    CODE:

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 const int M=1000005;
     8 double s,all,per,pfir;
     9 int n;
    10 double p[M],d[M];
    11 double ans;
    12 void isok(){
    13     for (int i=1;i<n;i++){
    14         if (d[i+1]-d[i]>all*per) {
    15             cout<<"No Solution"<<endl;
    16             exit(0);
    17         }
    18     }
    19     if (s-d[n]>all*per){
    20         cout<<"No Solution"<<endl;
    21         exit(0);
    22     }
    23     return ;
    24 }
    25 int main() {
    26     cin>>s>>all>>per>>pfir>>n;
    27     n++;
    28     for (int i=2;i<=n;i++) cin>>d[i]>>p[i];
    29     d[1]=0,p[1]=pfir;
    30     isok();
    31     d[++n]=s;p[n]=-1;
    32     double nowp=0;
    33     for (int i=1;i<n;){
    34         bool flag=false;
    35         int j;
    36         for (j=i+1;j<=n;j++) {
    37             if (p[j]<p[i]&&d[j]-d[i]<=all*per) {flag=true;break;}
    38         }
    39         if (flag){
    40             if (j==n) {ans+=((d[n]-d[i])/per-nowp)*p[i];break;}
    41             else ans+=(d[j]-d[i])/per*p[i];    
    42             i=j;
    43         }
    44         else {
    45             double minn=1<<30;
    46             int minpos=i+1,k;
    47             for (k=i+1;k<=n;k++){
    48                 if (d[k]-d[i]>all*per) break;
    49                 if (p[k]<minn) minpos=k,minn=p[k];
    50             }
    51             if (minpos==n) ans+=((d[n]-d[i])/per-nowp)*p[i];
    52             else {
    53                 ans+=(all-nowp)*p[i];
    54                 nowp=all-(d[minpos]-d[i])/per;
    55             }
    56             i=minpos;
    57         }
    58         //cout<<i<<" "<<nowp<<" "<<ans<<" "<<d[i]<<" "<<all*per<<endl;
    59     }
    60     //ans+=(s-d[n])/per*p[n];
    61     printf ("%.2lf",ans);
    62     return 0;
    63 }
  • 相关阅读:
    gitlab11.5.4 配置邮件提醒
    docker 安装 mongodb
    dd测试
    k8s部署rocketmq 双主
    rocketmq 多master集群部署
    Kubernetes中的Taint污点和Toleration容忍
    Zookeeper分布式集群搭建
    初识ZooKeeper
    hdu 5071(2014鞍山现场赛B题,大模拟)
    hdu 5073
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11380104.html
Copyright © 2020-2023  润新知