题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071

解题报告:一个管理聊天窗口的程序,一共有八种操作,然后要注意的就是Top操作只是把编号为u的窗口标记为一种特殊的状态,在这种特殊的状态下优先级是最高的,聊天都是跟这个聊,而这个窗口并没有在实际上被提到最前面.还有就是每句后面都有句号.我本来可以1A的,但就是因为没看这个,所以一直WA也找不到原因.

暴力模拟就可以了,因为点最多只有5000个,不会超时,维护一个队列就可以了,但我为了方便判断是不是已经存在还用了一个map容器.

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<map>
  6. #include<set>
  7. #include<deque>
  8. using namespace std;
  9.  
  10. deque<int> que;
  11. deque<int>::iterator iter;
  12. map<int,int> mp;
  13.  
  14. int T,n,x,top,istop;
  15. void Add()
  16. {
  17. scanf("%d",&x);
  18. if(mp[x] == )
  19. {
  20. que.push_back(x);
  21. mp[x] = -; //因为map查找没有时返回是0,为了避免冲突,初始化为-1
  22. puts("success.");
  23. }
  24. else puts("same priority.");
  25. }
  26.  
  27. void Close()
  28. {
  29. scanf("%d",&x);
  30. if(mp[x] )
  31. {
  32. if(mp[x] > ) printf("close %d with %d.\n",x,mp[x]);
  33. else printf("close %d with 0.\n",x);
  34. if(istop && top == x) istop = ; // 关掉always状态的就要把这个标记取消掉,不然会出错,但是注释掉也过了,说明没有关掉always状态的操作
  35. //但个人觉得还是加上比较好,因为这个操作可以关掉一切存在的 窗口,不加这个可以过就是测试数据的问题了
  36. for(iter = que.begin();iter != que.end();++iter)
  37. if(*iter == x)
  38. {
  39. que.erase(iter);
  40. break;
  41. }
  42. mp.erase(x);
  43. }
  44. else puts("invalid priority.");
  45. }
  46. void Chat()
  47. {
  48. scanf("%d",&x);
  49. int t;
  50. if(que.empty())
  51. {
  52. puts("empty.");
  53. return ;
  54. }
  55. if(istop) t = top; //如果存在always top
  56. else t = *que.begin();
  57. if(mp[t] == -) mp[t] = x;
  58. else mp[t] += x;
  59. puts("success.");
  60. }
  61. void Rotate()
  62. {
  63. scanf("%d",&x);
  64. if(x > que.size())
  65. {
  66. puts("out of range.");
  67. return ;
  68. }
  69. int t = x - ;
  70. iter = que.begin();
  71. while(t--) iter++;
  72. t = *iter;
  73. que.erase(iter);
  74. que.push_front(t);
  75. puts("success.");
  76. }
  77. void Prior()
  78. {
  79. if(que.empty())
  80. {
  81. puts("empty.");
  82. return ;
  83. }
  84. deque<int>::iterator M = que.begin();
  85. for(iter = que.begin();iter != que.end();++iter)
  86. if(*M < *iter) M = iter;
  87. int t = *M;
  88. que.erase(M);
  89. que.push_front(t);
  90. puts("success.");
  91. }
  92. void Choose()
  93. {
  94. scanf("%d",&x);
  95. if(mp[x] == )
  96. {
  97. puts("invalid priority.");
  98. return ;
  99. }
  100. for(iter = que.begin();iter != que.end();++iter)
  101. if(*iter == x)
  102. break;
  103. que.push_front(x);
  104. que.erase(iter);
  105. puts("success.");
  106. }
  107. void Top()
  108. {
  109. scanf("%d",&x);
  110. if(mp[x] == )
  111. {
  112. puts("invalid priority.");
  113. return ;
  114. }
  115. istop = ;
  116. top = x;
  117. puts("success.");
  118. }
  119. void Untop()
  120. {
  121. if(istop == )
  122. {
  123. puts("no such person.");
  124. return ;
  125. }
  126. istop = ;
  127. puts("success.");
  128. }
  129.  
  130. int main()
  131. {
  132. // freopen("in","r",stdin);
  133. char oper[];
  134. scanf("%d",&T);
  135. while(T--)
  136. {
  137. scanf("%d",&n);
  138. mp.clear();
  139. que.clear();
  140. istop = ; //是否存在top
  141. int kase = ;
  142. while(n--)
  143. {
  144. scanf("%s",oper);
  145. printf("Operation #%d: ",kase++);
  146. if(!strcmp(oper,"Add")) Add();
  147. else if(!strcmp(oper,"Close")) Close();
  148. else if(!strcmp(oper,"Chat")) Chat();
  149. else if(!strcmp(oper,"Rotate")) Rotate();
  150. else if(!strcmp(oper,"Prior")) Prior();
  151. else if(!strcmp(oper,"Choose")) Choose();
  152. else if(!strcmp(oper,"Top")) Top();
  153. else if(!strcmp(oper,"Untop")) Untop();
  154. }
  155. if(istop != && mp[top] > )
  156. {
  157. printf("Bye %d: %d\n",top,mp[top]);
  158. mp.erase(top);
  159. for(iter = que.begin();iter != que.end();++iter)
  160. if(*iter == top) break;
  161. que.erase(iter);
  162. }
  163. while(!que.empty())
  164. {
  165. if(mp[*que.begin()] > )
  166. printf("Bye %d: %d\n",*que.begin(),mp[*que.begin()]);
  167. mp.erase(*que.begin());
  168. que.pop_front();
  169. }
  170. }
  171. return ;
  172. }

HDU 5071 Chat(2014鞍山赛区现场赛B题)的更多相关文章

  1. HDU 5073 Galaxy(2014鞍山赛区现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 解题报告:在一条直线上有n颗星星,一开始这n颗星星绕着重心转,现在我们可以把其中的任意k颗星星移 ...

  2. HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽 ...

  3. HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少? 题意看了好久没懂.圆环 ...

  4. HDU 5071 Chat(2014鞍山B,模拟)

    http://acm.hdu.edu.cn/showproblem.php?pid=5071 Chat Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  5. HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...

  6. HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5112 解题报告:扫一遍 #include<cstdio> #include<cstr ...

  7. 2014 ACM/ICPC 鞍山赛区现场赛 D&amp;I 解题报告

    鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...

  8. HDU 4816 Bathysphere (2013长春现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...

  9. 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

    鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Fo ...

随机推荐

  1. Fix failed to start session in Ubuntu

    When you are at login, press Ctrl+Alt+F1. It will take you to command line interface from the GUI. I ...

  2. MySql视图、存储过程、函数、索引

    一.视图 视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集合,并可以当作表来查询使用. 1创建视图 - ...

  3. Django admin美化插件suit

    Django Suit 效果 使用前django页面 使用后django页面 安装 官方文档 http://django-suit.readthedocs.io/en/develop/index.ht ...

  4. omnet++5.0安装使用

    1.下载Windows安装包,5.0的omnetpp-5.0-src-windows.zip 2.解压到d盘 3.D:\omnetpp-5.0\doc找到这个目录,下面有个InstallGuide.p ...

  5. XmlHttpRequest对象的获取及相关操作

    一.获取XMLHttpRequest对象 方案一: function ajaxFunction(){ var xmlHttp; try{ // Firefox, Opera 8.0+, Safari ...

  6. css007 margin padding border

    css007 margin padding border 1.理解盒模型(盒模型:就是把一些东西,包括html各种标签都包含在一个 看不见的盒子里) 1/在web浏览器中任何标签都是一个盒子,内容的周 ...

  7. orancle的安装和配置

    1.安装 Oracle 版本:Oracle Database 10g Release 2 (10.2.0.1) 下载地址: http://www.oracle.com/technology/softw ...

  8. Java数据结构——链表-单链表

    <1>链表 <2>引用和基本类型 <3>单链表 //================================================= // Fil ...

  9. Using Flash Builder with Flash Professional

    http://help.adobe.com/en_US/flashbuilder/using/WSc5cd04c102ae3e97-6e5d439512e1414e588-8000.html

  10. xcopy

    xcopy "$(ProjectDir)Admin"  "$(SolutionDir)模块\CanDoo.Admin.WebHost\Admin"  /e/h ...