POJ - 2431贪心 + 优先队列

46 篇文章 2 订阅
29 篇文章 0 订阅

题目

在这里插入图片描述

题解思路

贪心思维
走到不能走时,不断用之前走过的能加油的最大值加,加到加不了还是走不到就是-1。
这样只能判断所有加油站能不能到,这时我们在重点设置一个虚拟加油站来进行上面的操作。
寻找最大量加油的过程用优先队列优化。
边走边把能加油的加上。

AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;
struct node
{
    int t,w;
}a[101000];
int vis[101000];
bool cmp(node A,node B)
{
    if ( A.t == B.t )
        return A.w > B.w ;
    return A.t > B.t;
}
int main ()
{
    int n,k,f;
    cin>>n;
    for (int i = 1 ; i <= n ; i++ )
    {
        int t1,t2;
        cin>>t1>>t2;
        a[i].t = t1;
        a[i].w = t2;
    }
    a[n+1].t = 0 ;
    a[n+1].w = 0 ;
    cin>>k>>f;
    sort(a+1,a+2+n,cmp);
    if ( k <= f )
        cout<<"0\n";
    else
    {
        priority_queue <int> q;
        int pit = k-f;
        int ans = 0 ,book = 1;
        for (int i = 1 ; i <= n+1; i++ )
        {
            if ( a[i].t >= pit)
            {
                q.push(a[i].w);
            }else
            {
                while(!q.empty())
                {
                    if ( a[i].t >= pit)
                        break;
                    pit -= q.top();
                    q.pop();
                    ans++;
                }
                if ( pit > a[i].t )
                 {
                        book = 0;
                        break;
                }
                q.push(a[i].w);
            }
        }
        if (book)
            cout<<ans<<"\n";
        else
            cout<<"-1\n";
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值