【51NOD-1191-消灭兔子】优先队列+贪心

本文探讨了51NOD1191消灭兔子问题,通过将箭矢按杀伤力降序排序,兔子生命值按降序排序,并使用优先队列与双指针技巧,实现了最小花费下杀死所有兔子的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

51NOD1191消灭兔子
题意
就 是 有 n 只 生 命 值 不 同 的 兔 子 , 有 m 支 不 同 的 箭 就是有n只生命值不同的兔子,有m支不同的箭 nm
每 种 箭 有 不 同 的 伤 害 和 花 费 , 每 个 兔 子 只 能 被 射 一 次 , 每 支 箭 只 能 用 一 次 每种箭有不同的伤害和花费,每个兔子只能被射一次,每支箭只能用一次
求 杀 死 所 有 兔 子 的 最 小 花 费 。 求杀死所有兔子的最小花费。
做法
由 于 每 只 兔 子 只 能 被 射 一 次 , 每 支 箭 只 能 用 一 次 由于每只兔子只能被射一次,每支箭只能用一次
我 们 就 可 以 将 箭 按 杀 伤 力 降 序 排 序 , 将 兔 子 生 命 值 按 降 序 排 序 我们就可以将箭按杀伤力降序排序,将兔子生命值按降序排序
然 后 将 所 有 能 杀 死 当 前 兔 子 的 箭 丢 进 价 值 小 优 先 的 优 先 队 列 , 然 后 双 指 针 不 断 杀 死 每 只 兔 子 即 可 。 然后将所有能杀死当前兔子的箭丢进价值小优先的优先队列,然后双指针不断杀死每只兔子即可。
代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 5e4+10;
int B[maxn];
struct data
{
    int d,p;
}x[maxn];
bool cmp(const data &a,const data &b)
{
    return a.d>b.d;
}
struct node
{
    int d,p;
    node(int dd,int pp)
    {
        d=dd;
        p=pp;
    }
    friend bool operator < (node a, node b)
    {
        return a.p>b.p;//结构体中,x小的优先级高
    }
};
priority_queue<node>pq;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)  scanf("%d",&B[i]);
    for(int i=1;i<=m;i++)  scanf("%d%d",&x[i].d,&x[i].p);
    sort(B+1,B+1+n);
    sort(x+1,x+1+m,cmp);
    int pos=1;
    int cnt=0;
    long long  ans=0;
    for(int i=n;i>=1;i--)
    {
        while(pos<=m&&x[pos].d>=B[i])
        {
            pq.push(node(x[pos].d,x[pos].p));
            pos++;
        }
        if(pq.empty()) break;
        else
        {
            cnt++;
            node tmp=pq.top();
            pq.pop();
            ans+=tmp.p;
        }
    }
    if(cnt==n)
    {
        printf("%lld\n",ans);
    }
    else
    {
        printf("No Solution\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值