• 洛谷P1016 旅行家的预算 贪心


    这道题就是贪心
    1、在第一个加油站的时候,如果在加满油能够到达的加油站中有一个加油站的钱比自己的少(其实等于也行),那就 加足够到那个车站的油,直接去那个车站
    2、这些车站中所有都比自己大,那就找一个其中钱最少的车站 在当前车站加满油,然后直接开到那个车站
    3、然后到达车站时就不断重复以上的处理方法
    4、但这样有一个问题就是你无法到达最后一个车站,于是我们把最后一个车站的费用变为0(其实还是-1更保险)这样就保证如果能到,就一定能走到最后一个
    车站
    5、那么如何判断能否到达呢?如果在一次加油站处理操作时,发现加满油了仍然一个车站都不能到达,那就不能到达了。

    下面贴代码,感觉自己写的好丑啊

    #include <cstdio>
    #include <cmath>
    #include <cstdlib>
    #include <cstdlib>
    #include <algorithm>
    using namespace std ;
    
    struct node{
        double wei,p ;
    };
    
    double d1,c,d2,you,w ;
    double ans ;
    int n,x,k;
    double y,mi ;
    node a[1000011] ;
    bool f,ff ;
    
    bool cmp(node a,node b) 
    {
        return a.wei<b.wei ;
    }
    
    int main() 
    {
        scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&a[0].p,&n) ;
        a[0].wei = 0 ;
        for(int i=1;i<=n;i++) 
        {
            scanf("%lf%lf",&a[i].wei,&a[i].p) ;
        }
        sort(a+1,a+n+1,cmp) ;
        a[++n].wei = d1 ;
        a[n].p = 0 ; 
        x = 0 ;
        while(x<n)       
        {
            mi = 1000000000 ;
            y = a[x].wei + d2*c ;
            f = false ;  ff = false ;
            for(int i=x+1;x<=n&&a[i].wei<=y;i++) 
            {
                f = true ; 
                if(a[i].p<=a[x].p)          //   等于应该也开的吧 
                {
                    k = i ;
                    w=(a[i].wei-a[x].wei)/d2 ;
                    if(you>=w) 
                    {
                        you-=w ;
                    }
                    else 
                    {
                        ans=ans+(w-you)*a[x].p ;
                        you = 0 ;
                    }
                    x = i ;
                    ff = true ;
                    break ;
                }
                if(a[i].p<mi) mi = a[ i ].p,k = i ;
            }
            if(ff) continue ;
            if(!f) 
            {
                printf("No Solution
    ") ;
                return 0 ;
            }
            ans = ans + (c-you) *a[x].p ;
            you = c - (a[k].wei-a[x].wei) /d2 ;
            x = k ;        
        }
        printf("%.2lf",ans) ;
        return 0 ;
    }
  • 相关阅读:
    网页定位导航
    position元素的定位
    节点属性
    css控制换行,断词
    css隐藏多余文字显示...
    重绘和回流
    CSS属性书写顺序
    模拟select
    常用html标签
    clientHeight、scrollHeight和offsetHeight基本用法
  • 原文地址:https://www.cnblogs.com/third2333/p/6816315.html
Copyright © 2020-2023  润新知