hdu1509堆 优先级队列
来源:互联网 发布:mindnode pro for mac 编辑:程序博客网 时间:2024/06/05 18:56
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=1509
题目意思:
模拟计算机信息的处理,优先队列,输入put 放置信息,信息含有优先级,输出get ,根据优先级和队列特点。
题目算法:
使用堆,根据优先级和进队顺序建堆。堆顶是优先级最大,且最较先进队的。
和上次堆排的题目类似,但是多了个优先级,值得注意的是,进队的num保存是不随堆大小的,而是随总的队长(包括已经出对的)
因为在出对的时候,堆长度要减1,因此进队的那个就不能跟着堆长。
另外,down的时候,要比较左右子节点的,这是与up不同的地方。
ac代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n=0;int count=0;char str[4],get[]="GET";struct node{ char name[1000]; int data; int pri; int num;}queue[60000+24];bool cmp(int a,int b){ if(queue[a].pri==queue[b].pri) return queue[a].num < queue[b].num; return queue[a].pri < queue[b].pri;}void swap(int a,int b){ node temp; temp = queue[a]; queue[a] = queue[b]; queue[b] = temp;}void up(int c){ if(c==1)return; if(cmp(c,c/2)){ swap(c,c/2); up(c/2); }}void insert(){ ++n; ++count; scanf("%s%d%d",queue[n].name,&queue[n].data,&queue[n].pri); queue[n].num=count; up(n);}void down(int c){ int k=2*c; if(k>n)return; if(k+1<=n && cmp(k+1,k))k++; if(cmp(k,c)) { swap(k,c); down(k); }}void pop(){ if(n==0)printf("EMPTY QUEUE!\n"); else{ printf("%s %d\n",queue[1].name,queue[1].data); swap(1,n--); down(1); }}int main(){ //freopen("1509.txt","r",stdin); while(~scanf("%s",str)) { if(strcmp(str,get)==0)pop(); else{ insert(); } } return 0;}
0 0
- hdu1509堆 优先级队列
- HDU1509(优先级队列+模拟)
- 堆与优先级队列
- 堆与优先级队列
- 堆优先级队列
- 优先级队列+堆
- 堆构造优先级队列
- 最大堆优先级队列
- 堆和优先级队列
- 二叉堆&&优先级队列
- 堆(优先级队列)
- 【数据结构】堆&优先级队列
- 堆&优先级队列
- 优先级队列--最大堆
- 堆--优先级队列
- 优先级队列---使用堆
- 堆和优先级队列
- 堆&&堆排序&&优先级队列
- windows多线程同步--信号量
- C++虚函数
- java反射机制——通过无参构造实例化对象
- LeetCode: Merge two sorted linked lists
- Android 动画之ScaleAnimation应用详解
- hdu1509堆 优先级队列
- windows多线程同步--临界区
- Qt属性系统详解
- windows多线程同步--互斥量
- window7下Java环境变量配置图解
- 有AI的重力四子棋
- windows多线程同步--事件
- LeetCode 汇总三
- windows多线程--原子操作