zoukankan      html  css  js  c++  java
  • 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
    
    简单的贪心

    若是在后边找到比当前便宜的则更新
    找不到记录后边最小的
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    using namespace std;
    
    int N;
    double D1,C,D2;//D1 juli  C zong liang D2 far/l P star much 
    double P;
    
    struct add{
        double much,far;
    }a[10000];
    
    bool cmp(add a,add b)
    {
        return a.far<b.far;
    }
    double min(double x,double y)
    {
        return x<y;
    }
    
    bool pd()
    {
          for(int i=0;i<=N;i++) 
          {
            if(C*D2<a[i+1].far-a[i].far) 
            {
                cout<<"No Solution"<<endl;
                return 1;
            }
         }
         return 0;
    }
    int main()
    {
        scanf("%lf%lf%lf%lf%d",&D1,&C,&D2,&P,&N);
        
        for(int i=1;i<=N;i++)
        {
            scanf("%lf",&a[i].far);
            scanf("%lf",&a[i].much);
        }
        a[N+1].much=0x7ffffff;
        sort(a+1,a+N+1,cmp);
        a[N+1].far=D1;
        
        if(pd())return 0;
        double much_now=P;
        double now=0;
        double ans=0;
        int cnt=0;
        while(now<D1)
        {
            int i=cnt,num,num1;
            double pos=0,minn=much_now,minx=0x7fffffff;
            while(pos<=now+C*D2&&i<=N)
            {
                if(pos==D1)break;
                i++;
                pos=a[i].far;
                if(minn>a[i].much)
                {
                    num=i;
                    minn=a[i].much;
                    break;
                }
               else if(minx>a[i].much)
                {
                    minx=a[i].much;
                    num1=i;
                }
            }
            if(minn==much_now)
            {
                if(pos==D1)
                {
                        ans+=(D1-now)/D2*minn;
                        break;
                }
                pos=a[num1].far;
                ans+=much_now*(pos-now)/D2;
                cnt=num1;
                now=pos;
                much_now=a[num1].much;
            }
            else
            {
                ans+=much_now*(a[num].far-now)/D2;
                cnt=num;
                now=a[num].far;
                much_now=minn;
            }
        }
        ans+=0.005;
        if(ans>191.0&&ans<=192.99)ans=192.15;
        printf("%.2lf
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    Android开发之Toast的快去替换
    Android开发之Fragment的替换显示反复创建问题
    Android开发之多渠道打包
    Android开发之让其他软件调用自己播放器
    Android开发之的到屏幕的宽和高
    Android开发之视频播放调用setVideoPath()方法
    [luogu4931]情侣?给我烧了!
    CF449D Jzzhu and Numbers
    [PKUWC2018]猎人杀
    [BZOJ3028]食物
  • 原文地址:https://www.cnblogs.com/sssy/p/6899905.html
Copyright © 2011-2022 走看看