• [luogu]P1016 旅行家的预算[贪心]


    [luogu]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

    【数据范围】

    N<=6


    贪心,每次找最近的比当前价格便宜的加油站,刚好开到那,如果没有,就把油加满,开往下一个目的地。

    代码:

     1 //2017.10.31
     2 //greedy
     3 #include<iostream>
     4 #include<cstdio>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 namespace lys{
     9     struct road{
    10         double dis;
    11         double add;
    12     }gas[16];
    13     int n;
    14     double d1,d2,c,p,ans,s,x,y;
    15     bool cmp(const road &x,const road &y){return x.dis<y.dis;}
    16     int main(){
    17         int i,j,k;
    18         scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&n);
    19         gas[1].dis=0,gas[1].add=p;
    20         n+=2;
    21         gas[2].dis=d1,gas[2].add=0;
    22         for(i=3;i<=n;i++) scanf("%lf%lf",&gas[i].dis,&gas[i].add);
    23         s=c*d2;
    24         sort(gas+1,gas+n+1,cmp);
    25         for(i=1;i<=n;){
    26             if(gas[i+1].dis-gas[i].dis>s){
    27                 puts("No Solution");
    28                 return 0;
    29             }
    30             for(k=i+1;k<=n&&(gas[k].dis-gas[i].dis)<=s;k++)
    31                 if(gas[k].add<=gas[i].add){
    32                     y=(gas[k].dis-gas[i].dis)/d2;
    33                     if(x<y) ans+=(y-x)*gas[i].add,x=0;
    34                     else x-=y;
    35                     i=k;
    36                     break ;
    37                 }        
    38             if(i==n){
    39                 printf("%.2lf
    ",ans);
    40                 return 0;
    41             }
    42             if(i!=k){
    43                 ans+=gas[i].add*(c-x);
    44                 x=c-(gas[i+1].dis-gas[i].dis)/d2;
    45                 i++;
    46             }    
    47         }
    48         return 0;
    49     }
    50 }
    51 int main(){
    52     lys::main();
    53     return 0;
    54 }
  • 相关阅读:
    【LeetCode】152. 乘积最大子数组(DP)
    【剑指Offer】49. 丑数(三指针)
    [P1979][NOIP2013] 华容道 (BFS建图+SPFA)
    [P1850][NOIP2016] 换教室 (期望+DP+Floyd)
    差分约束学习笔记
    [P1291][SHOI2002] 百事世界杯之旅 (期望)
    [P4342][IOI1998] Polygon (区间DP)
    [P3802] 小魔女帕琪 (期望)
    [P1273] 有线电视网 (树形DP+分组背包)
    树链剖分学习
  • 原文地址:https://www.cnblogs.com/_inx/p/7761417.html
Copyright © 2020-2023  润新知