1. 程式人生 > >51Nod 1191 消滅兔子 (貪心+優先佇列)

51Nod 1191 消滅兔子 (貪心+優先佇列)

  對兔子血量排個降序(即從血多的開始殺),對弓箭按傷害值降序排。對每一隻兔子,都要把能殺死他的弓箭的價值入隊,入隊完畢以後,如果佇列為空說明這個兔子殺不了,不為空說明這個兔子能殺,那就從能殺這個兔子的弓箭裡選個最便宜的,按照這樣對n只兔子操作

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e4+10;
struct node
{
    int d,p;
    node(int dd=0,int pp=0)
    {
        d=dd;
        p=pp;
    }
}a[maxn];
struct node1
{
    int p;
    node1(int pp=0)
    {
        p=pp;
    }
    friend bool operator<(const node1&ii,const node1&oo)
    {
        return ii.p>oo.p;
    }
};
bool cmp1(const int&aa,const int&bb)
{
    return aa>bb;
}
bool cmp2(const node&j1,const node&j2)
{
    return j1.d>j2.d;
}
int b[maxn];
int main()
{
    int n,m,flag=1;
    ll ans=0;
    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",&(a[i].d),&(a[i].p));
    sort(b+1,b+n+1,cmp1);
    sort(a+1,a+m+1,cmp2);
    priority_queue<node1>q;
    while(!q.empty())
        q.pop();
    for(int i=1,j=1;i<=n;i++)
    {
        while(j<=m&&a[j].d>=b[i])
                q.push(node1(a[j].p)),j++;
        if(q.empty())
        {
            printf("No Solution\n");
            return 0;
        }
        ans+=q.top().p;
        q.pop();
    }
    printf("%lld\n",ans);
    return 0;
}