您的位置:首页 > 其它

腾讯马拉松复赛第三场,HDOJ-4544 - 湫湫系列故事——消灭兔子

2013-03-31 22:04 197 查看
贪心+优先队列维护

先将所有的兔子排序...再将所有的箭按伤害排序...

做的时候从血量大的兔子往血量小的做...每次找能杀死这只兔子并且所需消耗最小的箭...

直接做...超时..并且不好维护...引入优先队列...

Program:

#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#include<algorithm>
#include<stdio.h>
#define ll long long
#define oo 1000000000
using namespace std;
struct node
{
       ll d,p;
       bool operator < (const node &x) const
       {
              return p>x.p;
       }
}r[100005];
ll n,m,b[100005];
priority_queue<node> myqueue;
bool cmp(node a,node b)
{
       return a.d<b.d;
}
int main()
{ 
       ll i,h,ans; 
       node p;
       while (~scanf("%I64d%I64d",&n,&m))
       {
              for (i=1;i<=n;i++) scanf("%I64d",&b[i]);
              for (i=1;i<=m;i++) scanf("%I64d",&r[i].d);
              for (i=1;i<=m;i++) scanf("%I64d",&r[i].p);
              sort(b+1,b+1+n);
              sort(r+1,r+1+m,cmp); 
              while (!myqueue.empty()) myqueue.pop();
              h=m;
              ans=0;
              for (i=n;i>=1;i--)
              {
                     while (h && r[h].d>=b[i]) myqueue.push(r[h]),h--;
                     if (myqueue.empty()) 
                     {
                             printf("No\n");
                             goto A;
                     }
                     p=myqueue.top();
                     myqueue.pop();
                     ans+=p.p;
              }
              printf("%I64d\n",ans); 
              A: ;
       }
       return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: