首页 > 代码库 > hdu4544 优先队列

hdu4544 优先队列

把兔子和箭一起处理   按血量或伤害从大到小排序       如果是兔子则标记为-1   否则为价格

贪心策略:

 对于每个兔子  只要找到能杀死它的最小价格就行  所以只要把比当前兔子血量大的箭放进优先队列   即可   


#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;

struct node
{
    int cost;
    bool operator < (const node& b) const
    {
        return cost>b.cost;
    }
}a;
struct Node
{
    int blood;
    int cost;
}A[500010];
int cmp(Node b,Node c)
{
    
    if(b.blood!=c.blood) return b.blood>c.blood;
    return b.cost>c.cost;
}
int main()
{
    int n,m,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&A[i].blood);
            A[i].cost=-1;
        }
        for(i=n+1;i<=n+m;i++)
        {
            scanf("%d",&A[i].blood);    
        }
        for(i=n+1;i<=n+m;i++)
        {
            scanf("%d",&A[i].cost);
        }
        sort(A+1,A+1+n+m,cmp);
        __int64 sum=0;
        priority_queue<node>q;
        int flash=0;
        for(i=1;i<=n+m;i++)
        {
            if(A[i].cost>=0)
            {
                a.cost=A[i].cost;
                q.push(a);
            }
            else
            {
                if(!q.empty())
                {
                    a=q.top();
                    q.pop();
                    sum+=a.cost;
                }
                else
                {
                    flash=1;
                    break;
                }
            }
        }
        if(flash) printf("No\n");
        else printf("%I64d\n",sum);
    }    
    return 0;
}

hdu4544 优先队列