POJ 2431 Expedition 贪心

题意:一辆汽车由起点开往小镇,总路程为L,路上有N个加油站,第i个加油站距离小镇a[i],最多可为提供b[i]的汽油,汽车开始时有P单位汽油,问汽车内否到达小镇,若能到达输出最小的加油次数。

 

思路:每经过一个加油站i,汽车就获得了一次在任何时候加油b[i]的权利,当汽车不足以到达下一站时,就加入过往的最大的b值。

#include<stdio.h>
#include<queue>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define LL long long
#define MOD 100000007
#define MAXSIZE 20005

using namespace std;

struct node
{
    int a,b;
}p[MAXSIZE];

int cmp(struct node A,struct node B)
{
    if(A.a != B.a)
        return A.a < B.a;
    return A.b > B.b;
}

int Solve(int n,int l,int k)
{
    priority_queue<int> Q;
    int ans=0,pos=0,hav=k;
    for(int i=0;i<=n;i++)
    {
        int d = p[i].a - pos;
        while(hav - d < 0)
        {
            if(Q.empty())
            {
                return -1;
            }

            hav += Q.top();
            Q.pop();
            ans++;
        }
        hav -= d;
        pos = p[i].a;
        Q.push(p[i].b);
    }
    return ans;
}

int main()
{
    int n,l,k;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&p[i].a,&p[i].b);
        }
        scanf("%d%d",&l,&k);
        for(int i=0;i<n;i++)
            p[i].a = l - p[i].a;
        p[n].a = l;
        p[n].b = 0;
        sort(p,p+n,cmp);
        int ans = Solve(n,l,k);
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2017-07-15 23:00  声声醉如兰  阅读(164)  评论(0编辑  收藏  举报