最小堆的维护,POJ(2051)
2016-05-11 20:18
447 查看
题目链接:http://poj.org/problem?id=2051
View Code
///维持最小堆(优先队列)POJ2051 #include <iostream> #include <string> using namespace std; struct Node { int Now; ///出堆的时间 int id; int p; ///时间间隔 }; Node node [3001]; int K; ///输出个数 void down (Node H[],int s,int m) { ///向下调整,s是要调整的编号,m是堆的size Node rc=H[s]; for(int j=s*2; j<=m; j*=2) { if(j<m) { if(H[j].Now>H[j+1].Now) { ///两个子节点中找到那个较小者 j++; } else { ///如果相等,比较ID if(H[j].Now==H[j+1].Now&&(H[j].id>H[j+1].id)) j++; } } if(rc.Now<H[j].Now||(rc.Now==H[j].Now&&rc.id<H[j].id)) break; H[s]=H[j]; ///更新子节点 s=j; } H[s]=rc; ///最后交换的子节点换上rc } ///建立一个最小堆 void MakeMinHeap(Node H[],int length) { for(int i=length/2; i>0; --i) down(H,i,length); } int main() { string str; int i=1; cin>>str; while(str.compare("#")!=0) { cin>>node[i].id>>node[i].p; node[i].Now=node[i].p; i++; cin>>str; } int len=i-1; cin>>K; MakeMinHeap(node,len); for(int i=1; i<=K; i++) { cout<<node[1].id<<endl; node[1].Now+=node[1].p; down(node,1,len); ///修改顶点后再次调整最小堆 } return 0; }
View Code
相关文章推荐
- 初学shell(必须掌握的20条指令)
- zookeeper运维
- 上传并解析excel文件
- ecshop二次开发--后台秒杀
- Linux 安装Tomcat指定JDK
- linux2.6.32.71如何在lcd上显示内核启动信息
- 解决tomcat上运行servlet使用jdbc异常的问题
- Centos:基于Git的代码自动部署
- There are no resources that can be added or removed from the server. .
- Linux 安装Tomcat指定JDK
- linux基础之vim编辑器使用技巧
- 理解Linux系统:/etc/init.d/目录
- JS实现剪切板添加网站版权、来源
- Linux——学习篇(一)
- ubuntu14.04中安装opencv2.4.9
- How to Setup OpenERP (Odoo) on CentOS 7.x
- packstack安装以及centos源配置注意事项
- 如何在CentOS 7.x中安装OpenERP(Odoo)
- CentOS下PostgreSQL 的安装与配置
- paramiko exec_command 返回 shell 脚本 exit 值