• P1016 旅行家的预算


    P1016 旅行家的预算

    题目描述

    一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=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

    分析:在能到达的加油站中内寻找最便宜的加油站,然后判断是否能一次到达,不能的话先加满,然后一个一个判断直到剩下的油量不足到下一个加油站就加油,不用加满。

      remain是当前剩余的油,cost花费,pos目标站

    所有有两种情况:
    1.当前站就是pos 再细分两种情况:
       1.从pos就可以走到终点,于是我们把油加到刚好到达终点即可
         cost += ((d[i] - d[pos]) / d2 - remain)*p[pos];就得到了最后答案。
        2.从pos不能一把走到终点于是,从当前位置走,走到哪里加油都不如在pos这里加油划算。所以加满。
    2.当前站点是在pos后面的某个站点,也有两种情况
        1.当前剩余的油remain不够走到此站,所以我们把油加来刚好能够走到此站就行了。(因为这里便宜!)
        2.剩余的油remain足够,直接开过去就行了。

     1 #include<cstdio>
     2 int n; 
     3 double d1,d2,c; 
     4 double remain=0,cost=0;
     5 double p[1010],d[1010];
     6 int main()
     7 {
     8     scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p[0],&n);
     9     for(int i=1;i<=n;++i)
    10     {
    11         scanf("%lf%lf",&d[i],&p[i]);
    12     }
    13     d[n+1] = d1;
    14     int pos = 0;
    15     do{
    16         bool flag = false;    //判断能不能到达 
    17         for (int i=pos+1;i<=n+1&&d[i]<=d[pos]+c*d2;i++) //判断加满油能不能到达下一个加油站
    18         {
    19             if(p[i]<p[pos])   //找更便宜的加油站 
    20             {
    21                 if(d[pos]+remain*d2>=d[i])    //如果剩余的油足够,就开过去
    22                 {
    23                     remain -= (d[i]-d[pos])/d2;//油量将减少从一个站点到下一个站点用到的油
    24                 }
    25                 else  //如果剩余的油不够
    26                 {
    27                     cost+=((d[i]-d[pos])/d2-remain)*p[pos];  //还需要加的油花费的价钱,不用加满
    28                     remain = 0;    //到达下一个站点时没油了,所以剩余汽油量清0
    29                 }
    30                 pos = i;
    31                 flag = true;
    32                 break;
    33             }
    34         }
    35         if(!flag)
    36         {
    37             cost += (c-remain)*p[pos];  //不能到达前花费了多少钱
    38             remain = c-(d[pos+1]-d[pos])/d2;     //还剩多少油
    39             if (remain>=0) pos++;  //小于0,油根本不够到达下一个站点,大于0,代表可以去下一个加油站
    40             else
    41             {
    42                 printf("No Solution");
    43                 return 0;
    44             }
    45         }
    46     }
    47     while(pos<=n);
    48     printf("%.2lf",cost);
    49     return 0;
    50 }
  • 相关阅读:
    线程的用法
    提高VS2010的性能,VS2010不再卡
    win7 远程桌面最大化快捷键
    java类加载器
    Class类
    JDBC获得oracle数据库主键值
    Zookeeper入门基础知识
    项目js总结
    jdk8 stream项目使用
    全局请求参数去除空格
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6905122.html
Copyright © 2020-2023  润新知