HDU1509

<!-- lang: cpp -->
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

struct Node
{
     char str_command[300];
     int parameter;
     int priority;
     int index;
     
     bool operator < (const Node& a) const;
     bool operator > (const Node& a) const;
};

inline bool Node::operator < (const Node& a) const
{
     if(priority != a.priority)
          return priority<a.priority;
     else
          return index<a.index;
}

inline bool Node::operator > (const Node& a) const
{
     if(priority != a.priority)
          return priority>a.priority;
     else
          return index>a.index;
}

class Heap
{     
public:
     Heap(){size=0;}
     void push(const Node& value);
     Node top(){return _heap[1];}
     Node pop();
     bool isEmpty(){return size==0;}

private:
     Node _heap[60101];
     int size;

     void heapify_down(const int& pos);
     void heapify_up(const int& pos);
};



inline void Heap::push(const Node& value)
{
     _heap[++size]=value;
     heapify_up(size);
}

inline Node Heap::pop()
{
     Node ret=_heap[1];
     _heap[1]=_heap[size--];
     heapify_down(1);
     
     return ret;
}

inline void Heap::heapify_down(const int& pos)
{
     for(int i=pos;(i<<1)<=size;)
     {
          int s=i<<1,r=(i<<1)+1;
          if(r<=size && _heap[r]<_heap[s])
               s=r;
          
          if(_heap[i]>_heap[s])
          {
               swap(_heap[i],_heap[s]);
               i=s;
          }
          else
               break;
     }
}

inline void Heap::heapify_up(const int& pos)
{
     for(int i=pos;i>1;)
     {
          int s=i>>1;
          if(_heap[i]<_heap[s])
          {
               swap(_heap[i],_heap[s]);
               i=s;
          }
          else
               break;
     }
}

Heap heap;

int main()
{
     char buf[300];
     int index=0;

     while(cin>>buf)
     {
          if(strcmp("GET",buf)==0)
          {
               if(heap.isEmpty())
                    cout<<"EMPTY QUEUE!"<<endl;
               else
               {
                    Node output=heap.pop();
                    cout<<output.str_command<<' '<<output.parameter<<endl;
               }
          }
          else
          {
               index++;
               int par,pri;
               cin>>buf>>par>>pri;
               Node in;
               strcpy(in.str_command,buf);
               in.parameter=par;
               in.priority=pri;
               in.index=index;
               heap.push(in);
          }
     }

     return 0;
}

转载于:https://my.oschina.net/fzyz999/blog/142159

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值