洛谷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 ;
}
原文地址:https://www.cnblogs.com/third2333/p/6816315.html