题目链接: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),这样问题就解决了。

想想这种取补的方法应该挺好的。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<string>
  9. #include<map>
  10. #include<vector>
  11. #include<queue>
  12.  
  13. #define LL long long
  14.  
  15. using namespace std;
  16.  
  17. priority_queue<int>q[4];
  18. char s[100];
  19.  
  20. int main()
  21. {
  22.  
  23. int n,cnt,doc,pri,sum;
  24. while(scanf("%d",&n)!=EOF)
  25. {
  26. for(int i = 1; i<=3; i++)
  27. while(!q[i].empty()) q[i].pop();
  28.  
  29. cnt = 0;
  30.  
  31. for(int i = 0; i<n; i++)
  32. {
  33. scanf("%s",s);
  34. if(s[0]=='I' && s[1]=='N')
  35. {
  36. scanf("%d%d",&doc,&pri);
  37. cnt++;
  38.  
  39. sum = pri*10000 + (2000-cnt);
  40.  
  41. q[doc].push(sum);
  42. }
  43.  
  44. else
  45. {
  46. scanf("%d",&doc);
  47.  
  48. if(q[doc].empty())
  49. puts("EMPTY");
  50. else
  51. {
  52. sum = q[doc].top();
  53. q[doc].pop();
  54.  
  55. sum %= 10000;
  56. sum = 2000-sum;
  57. printf("%d\n",sum);
  58. }
  59.  
  60. }
  61.  
  62. }
  63. }
  64.  
  65. return 0;
  66. }

优先队列:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<string>
  9. #include<map>
  10. #include<vector>
  11. #include<queue>
  12.  
  13. #define LL long long
  14.  
  15. using namespace std;
  16.  
  17. struct node
  18. {
  19. int pri,x;
  20.  
  21. bool operator <(const node& t2) const
  22. {
  23. if(pri==t2.pri) return x>t2.x;
  24. return pri<t2.pri;
  25. }
  26. };
  27. node now;
  28. priority_queue<node>q[4];
  29. char s[100];
  30.  
  31. int main()
  32. {
  33.  
  34. int n,cnt,doc,pri,sum;
  35. while(scanf("%d",&n)!=EOF)
  36. {
  37. for(int i = 1; i<=3; i++)
  38. while(!q[i].empty()) q[i].pop();
  39.  
  40. cnt = 0;
  41.  
  42. for(int i = 0; i<n; i++)
  43. {
  44. scanf("%s",s);
  45. if(s[0]=='I' && s[1]=='N')
  46. {
  47. scanf("%d%d",&doc,&pri);
  48.  
  49. now.pri = pri;
  50. now.x = ++cnt;
  51. q[doc].push(now);
  52. }
  53.  
  54. else
  55. {
  56. scanf("%d",&doc);
  57.  
  58. if(q[doc].empty())
  59. puts("EMPTY");
  60. else
  61. {
  62. now = q[doc].top();
  63. q[doc].pop();
  64. printf("%d\n",now.x);
  65. }
  66. }
  67. }
  68. }
  69. return 0;
  70. }

HDU1873 看病要排队 —— 优先队列(STL)的更多相关文章

  1. hdu1873 看病要排队 优先队列

    看病要排队 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. HDU1873 看病要排队【模拟+优先队列】

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. hdu1873 看病要排队【优先队列】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 看病要排队 Time Limit: 3000/1000 MS (Java/Others)     ...

  4. hdu1873 看病要排队(结构体优先队列)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  5. HDU 1873 看病要排队 优先队列

    Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  6. HDU-1873 看病要排队(队列模拟)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. HDUOj 看病要排队 优先队列的使用 题目1873

    STL优先队列的具体描写叙述 http://blog.csdn.net/yueloveme/article/details/47106639 题目地址:http://acm.hdu.edu.cn/s ...

  8. hdoj 1873 看病要排队【优先队列】

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. hdu1837 看病要排队(优先队列)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 51Nod 约数之和

                              1220 约数之和                                  题目来源: Project Euler 基准时间限制:3 秒 ...

  2. shell-异步执行

    一.启动后台子任务 在执行命令后加&操作符,表示将命令放在子shell中异步执行.可以达到多线程效果.如下, sleep 10 #等待10秒,再继续下一操作 sleep 10 & #当 ...

  3. Laravel composer自定义命令空间,方便引用第三方库

    第一步:自定义目录 在app文件夹下新建Library目录,做为第三方库的目录 第二步: 修改composer.json文件 autoload节点下的psr-4自定义命名空间 规则: key: 命名空 ...

  4. Go -- etcd详解(转)

    CoreOS是一个基于Docker的轻量级容器化Linux发行版,专为大型数据中心而设计,旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度.CoreOS作为Docker生态 ...

  5. 转:如何mac下使用wireshark

    Mac OS Mountain Lion默认是没有安装X11的,而wireshark运行需要x11,因此如果直接安装wireshark而没有安装x11,wireshark不会正常运行. 去苹果主页下载 ...

  6. C# 通过WebService方式 IIS发布网站 上传文件到服务器[转]

    http://blog.sina.com.cn/s/blog_517cae3c0102v0y7.html 应用场景:要将本地的文件 上传到服务器的虚拟机上 网络环境:公司局域网(如下图中第二种) 开发 ...

  7. TI C66x DSP 四种内存保护问题 -之- CPU訪问corePac内部资源时的内存保护问题

    CPU訪问corePac内部资源(L1.L2)时的内存保护(通过设置内存的訪问权限实现)等问题请參考以下两个blog.已经叙述的非常具体. "TI C66x DSP 系统events及其应用 ...

  8. 纯JS设置首页,增加收藏,获取URL參数,解决中文乱码

    雪影工作室版权全部,转载请注明[http://blog.csdn.net/lina791211] 1.前言 纯Javascript 设置首页,增加收藏. 2.设置首页 // 设置为主页 functio ...

  9. C++错误——”无法启动程序”…\xxx.exe” 系统找不到指定的文件”

    背景 在VS2010环境下,升级了一个用C++编写的程序,编译生成成功,但是,不能在VS中直接运行(可以通过打开debug文件目录的exe应用程序运行),提示以下错误:”无法启动程序”…\xxx.ex ...

  10. python(15)- 装饰器及装饰器的使用

    装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 装饰器的应用 下面题目同http://www.cnblogs.com/xuyaping/p/6679305.html,只不过加了装 ...