关闭

POJ 2431 Expedition(贪心)

390人阅读 评论(0) 收藏 举报
分类:

Description
有n个加油站,每个加油站的加油的油量有限,距离终点都有一个距离。一个卡车的油箱无限,每走一个单元要消耗一单元的油,问卡车到达终点的最少加多少次油
Input
第一行为一个整数N表示加油站数量,之后N行每行两个整数分别表示该加油站距终点距离和可加的油量,最后一行两个整数L和P分别表示起点到终点距离和卡车初始油箱内油量
Output
输出卡车到达终点时最少加油次数,如果不能到达终点则输出-1
Sample Input
4
4 4
5 2
11 5
15 10
25 10
Sample Output
2
Solution
把当前位置之前所有可加的油量都扔进优先队列里,如果当前油量够走到终点则不加,否则从优先队列里拿出油量最多的去加,最终如果当前位置不小于L说明可以到达终点,否则不能到达终点
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 11111
struct node
{
    int cnt,l;
    bool operator <(const node&b)const
    {
        return l>b.l;
    }
}a[maxn];
int n,L,P;
priority_queue<int>que;
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)scanf("%d%d",&a[i].l,&a[i].cnt);
        scanf("%d%d",&L,&P);
        if(P>=L)printf("0\n");
        else
        {
            sort(a,a+n);
            while(!que.empty())que.pop();
            int i=0,now=P,ans=0;
            while(i<n&&L-a[i].l<=P)que.push(a[i++].cnt);
            while(!que.empty())
            {
                now+=que.top();
                que.pop();
                ans++;
                if(now>=L)break;
                while(i<n&&L-a[i].l<=now)que.push(a[i++].cnt);
            }
            if(now>=L)printf("%d\n",ans);
            else printf("-1\n");
        }
    }
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:389486次
    • 积分:20147
    • 等级:
    • 排名:第428名
    • 原创:1677篇
    • 转载:0篇
    • 译文:0篇
    • 评论:64条
    最新评论