HDU5437 - Alisha’s Party (优先队列 模拟)
2015-09-29 18:27
274 查看
题目链接
刚开始做的时候,觉得直接用优先队列,可能会超时,还自己写了一个二叉堆,不过提交时发现并没有什么改善,估计是自己写的太烂了,还不如直接用C++里边的……
思路
按照题目要求,利用优先队列进行模拟。需要注意的就是可能有多个数据是同一时间,按照能进入的最大人数计算,不能累加,所有操作完成后,剩下的人还要按照礼物大小来依次全部进入。刚开始做的时候,觉得直接用优先队列,可能会超时,还自己写了一个二叉堆,不过提交时发现并没有什么改善,估计是自己写的太烂了,还不如直接用C++里边的……
代码
#include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <queue> using namespace std; struct node { char name[210]; int value; }fri[150100]; int ans[150100]; int que[150100]; struct cmp { bool operator()(int i, int j) { if(fri[i].value==fri[j].value) return i>j; return fri[i].value<fri[j].value; } }; int main() { int t, n, m, q; int cur, nCount, re; scanf("%d", &t); while(t--) { scanf("%d%d%d", &n, &m, &q); for(int i=1; i<=n; i++) scanf("%s%d", fri[i].name, &fri[i].value); memset(que, 0, sizeof(int)*(n+1)); int index, peo; for(int i=1; i<=m; i++) { scanf("%d%d", &index, &peo); que[index] = max(que[index], peo); } cur = 1; nCount = 0; priority_queue<int, vector<int>, cmp> qu; for(int i=1; i<=n; i++) { if(que[i]>0) { for(; cur<=i&&cur<=n; cur++) { qu.push(cur); } for(int j=0; j<que[i]&&!qu.empty(); j++) { ans[++nCount] = qu.top(); qu.pop(); } } if(cur>n) break; } for(;cur<=n; cur++) qu.push(cur); while(!qu.empty()) { ans[++nCount] = qu.top(); qu.pop(); } for(int i=1; i<=q; i++) { scanf("%d", &re); printf("%s%c", fri[ans[re]].name, " \n"[i==q]); } } return 0; }
相关文章推荐
- compatMode
- 【码之初】的一道有意思的数学题
- BZOJ 3545 [ONTAK2010]Peaks Treap启发式合并
- Jquery中$.get(),$.post(),$.ajax(),$.getJSON(),$.getScript(),$.load()的用法总结【转】
- iOS系列译文:自定义Collection View布局
- iOS视频录制,裁剪(输出指定大小)
- 当幸福来敲门观后感
- 计算机三级网络技术DHCP
- 简易四则计算器
- HTTP请求报文和HTTP响应报文
- 第八章 非规范化数据
- 长按移动cell
- 19.Android 清除按钮EditText - AIEditText
- 项目总结之关于JQuery一些常用的函数
- Eclipse自动生成所需的各种注释信息
- shell基础特性3
- 大写小,小写大
- RedHat 自定义用户环境
- vfork 挂掉的一个问题
- 设计模式详解