懒羊羊求援【优先队列】

贪心 专栏收录该内容
5 篇文章 0 订阅

题目描述

狼族来进攻羊村了。喜羊羊开始布置防御。但为了更好地抵制住进攻,他们需要一个人去其他羊村求援。这个光荣而艰巨的任务就交给了懒羊羊。路途好遥远,懒羊羊必须吃足够的草才能跑。他吃一两草能跑一公里路。但饿了就跑不动了。不过懒羊羊肚子大着,有多少青草他都能吃。但懒羊羊吃草很花时间,所以希望尽量少吃几次。路上有N个卖草的地方,你帮忙算下懒羊羊吃几次可以到达终点。

输入

第一行有一个 N ,表示路上有 N 个卖草的地方; ( 1 < = N < = 10000 ) (1<=N<=10000) (1<=N<=10000)
接下来 N N N 行,每行两个数, X , Y ; X X ,Y ; X XY;X(表示卖草的地方离终点的距离是多少公里地), Y Y Y(表示这个卖草的最多能卖多少两草)
1 < = x < 10000 ; 0 < = y < = 100 1<=x<10000;0<=y<=100 1<=x<10000;0<=y<=100
接下来一行两个数 L , P ; L L,P;L LPL(起点到终点的距离) P P P(表示开始的时候懒羊羊已经吃了多少两草) 0 = L < = 10000 ; 0=L<=10000; 0=L<=10000;

输出

输出数据占一行,当懒羊羊不能到达终点的时候,输出-1,否则输出最少的吃草次数;

样例输入

4
2 6
4 2
3 5
8 6
9 2

样例输出

2

题解:

贪心+优先队列
计算几个样例我们可以得知,优先去离起点近的草站肯定最优。
所以我们可以建一个优先队列,排序完序再进行模拟即可AC

C o d e : Code: Code:

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
struct node
{
    int x,y;
}a[N];
int cmp(node a,node b)
{
    return a.x>b.x;
}
priority_queue<int>Q;
int main()
{
    int n,l,p;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d%d",&a[i].x,&a[i].y);
        sort(a,a+n,cmp);
        scanf("%d%d",&l,&p);
        int ans=0,c=0,t=p,flag=0;
        a[n].x=0;a[n].y=0;
        for(int i=0;i<=n;i++)
        {
            int d=(l-a[i].x)-c;
            while(t-d<0)
            {
                if(Q.empty())
                {
                    ans=-1;
                    flag=1;
                    break;
                }
                t+=Q.top();
                Q.pop();
                ans++;
            }
            if(flag)break;
            t-=d;c=l-a[i].x;
            Q.push(a[i].y);
        }
        printf("%d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值