HDU1873 看病要排队 —— 优先队列(STL)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873
题解:
题目已经说出了解题方法:优先队列。但是之前没有学过优先队列,而且这题还是在现场赛做的。由于不会写优先队列的排序函数,所以自己想了个方法,觉得这种思维还可以,还是用优先队列。
队列priority_queue<int>q[4], 那么q是从大到小排列的,所以我就想将病人的优先级和编号放到一个int类型中,病人编号最大为2000,优先级最大为10。
由于排序的规则是先按优先级,再按编号,所以优先级的影响大,编号的影响小,那么可以将病人的信息整合到一个int中:102000。但是这样又出现了一个问题,
不同优先级的人先后解决了,但是相同优先级,不同编号的病人的顺序就搞反了。
相同优先级而编号小的病人理应排在前面,但却排在了后面,因为优先队列按从大到小排列。
怎么解决呢?由于编号的范围为1~2000,所以就想到了对编号进行对2000的取补,就是编号为k时,存进int里的,就应该是(2000-k),这样问题就解决了。
想想这种取补的方法应该挺好的。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<set>
#include<string>
#include<map>
#include<vector>
#include<queue> #define LL long long using namespace std; priority_queue<int>q[4];
char s[100]; int main()
{ int n,cnt,doc,pri,sum;
while(scanf("%d",&n)!=EOF)
{
for(int i = 1; i<=3; i++)
while(!q[i].empty()) q[i].pop(); cnt = 0; for(int i = 0; i<n; i++)
{
scanf("%s",s);
if(s[0]=='I' && s[1]=='N')
{
scanf("%d%d",&doc,&pri);
cnt++; sum = pri*10000 + (2000-cnt); q[doc].push(sum);
} else
{
scanf("%d",&doc); if(q[doc].empty())
puts("EMPTY");
else
{
sum = q[doc].top();
q[doc].pop(); sum %= 10000;
sum = 2000-sum;
printf("%d\n",sum);
} } }
} return 0;
}
优先队列:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<set>
#include<string>
#include<map>
#include<vector>
#include<queue> #define LL long long using namespace std; struct node
{
int pri,x; bool operator <(const node& t2) const
{
if(pri==t2.pri) return x>t2.x;
return pri<t2.pri;
}
};
node now;
priority_queue<node>q[4];
char s[100]; int main()
{ int n,cnt,doc,pri,sum;
while(scanf("%d",&n)!=EOF)
{
for(int i = 1; i<=3; i++)
while(!q[i].empty()) q[i].pop(); cnt = 0; for(int i = 0; i<n; i++)
{
scanf("%s",s);
if(s[0]=='I' && s[1]=='N')
{
scanf("%d%d",&doc,&pri); now.pri = pri;
now.x = ++cnt;
q[doc].push(now);
} else
{
scanf("%d",&doc); if(q[doc].empty())
puts("EMPTY");
else
{
now = q[doc].top();
q[doc].pop();
printf("%d\n",now.x);
}
}
}
}
return 0;
}
HDU1873 看病要排队 —— 优先队列(STL)的更多相关文章
- hdu1873 看病要排队 优先队列
看病要排队 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- HDU1873 看病要排队【模拟+优先队列】
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- hdu1873 看病要排队【优先队列】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 看病要排队 Time Limit: 3000/1000 MS (Java/Others) ...
- hdu1873 看病要排队(结构体优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 1873 看病要排队 优先队列
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDU-1873 看病要排队(队列模拟)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDUOj 看病要排队 优先队列的使用 题目1873
STL优先队列的具体描写叙述 http://blog.csdn.net/yueloveme/article/details/47106639 题目地址:http://acm.hdu.edu.cn/s ...
- hdoj 1873 看病要排队【优先队列】
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu1837 看病要排队(优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- chattr&chown&cat&cut&useradd&passwd&chage&usermod
1.用chattr命令防止系统中某个关键文件被修改 chattr +i /etc/resolv.conf chattr -i /etc/resolv.conf 要想修改此文件就要把i属性去掉 lsat ...
- cf744
Codeforces Round #385 (Div. 1) <br > A.Hongcow Builds A Nation 贪心. 显然就是凑成一个最大的块即可 那么首先并查集处理已经确 ...
- 某考试 T3 Try to find out the wrong in the test
Discription Hint: 对于 100% 的数据, n<=10^6.
- tomcat知识点
(1)使用线程池 Servlet引擎为每一个请求创建一个隔离的线程,分配这个线程给service()方法,在它执行完后移除这个线程.默认情况下,servlet引擎 为每一个请求创建新的线程.因为创 ...
- 产品如何进行大屏数据可视化.md
最近接到一个需求,需要给公司的竞赛平台面对省/校/竞赛进行大屏的可视化话数据展示,闲暇之余对自己最近的工作进行一些总结; 一.数据可视化的定义 数据可视化主要是关于数据_视觉表现形式的科学技术研究 - ...
- G 全然背包
<span style="color:#3333ff;">/* /* _________________________________________________ ...
- Flex4_Tree组件2(添加多选框、修改树图标)
1.新建AS类,用于为Tree生成复选框,及一些选择事件. package com.th.myUtils { import flash.events.Event; import flash.event ...
- Solaris设备管理
接手一台服务器,如何了解它的软硬件配置 数据库可以装在裸设备上,何为裸设备 知识点: 内核 驱动程序 设备命名 设备访问方式 磁盘的管理 内核: 指挥硬件干活的工具,shell翻译官,将人类语言翻译为 ...
- ffmpeg 内存池
ffmpeg 部分内存管理采用 了内存池技术.基本的接口在libavutil目录下的buffer.c文件中实现: 1. av_buffer_pool_init 初始化 内存池 2 av_buffer_ ...
- Long-term stable release maintenance
http://en.wikipedia.org/wiki/Linux_kernel 2014.5.28 2.6.32 2 December 2009[122] 2.6.32.62[123] Willy ...