题目:click here

题意:

  邀请k个朋友,每个朋友带有礼物价值不一,m次开门,每次开门让一定人数p(如果门外人数少于p,全都进去)进来,当最后所有人都到了还会再开一次门,让还没进来的人进来,每次都是礼物价值高的人先进。最后给出q个数,表示要输出第ni个进来的人的名字。

分析:

  优先队列问题。注意优先队列的比较函数即出队顺序,

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <cstring>
 5 #include <algorithm>
 6
 7 using namespace std;
 8 const int M = 150005;
 9
10 struct Node {   // 保存来客信息
11     char name[205];
12     int val;
13     int id;
14     bool operator < ( const Node x ) const {    // 排序注意--在优先队列中的出队顺序
15         if( val == x.val )  return id > x.id;
16         return val < x.val;
17     }
18 }node[M];
19 struct Time {   // 保存开门信息--要排序--给的数据可能不按顺序
20     int t, p;
21     bool operator < ( const Time x ) const { return t < x.t; }
22 }time[M];
23
24 int k, m, q;
25 char str[M][205];   // 答案
26
27 void solve()    {
28     scanf("%d%d%d", &k, &m, &q );
29     for( int i=1; i<=k; i++ )   {
30         scanf("%s %d", node[i].name, &node[i].val );
31         node[i].id = i;
32     }
33     for( int i=0; i<m; i++ )
34         scanf("%d%d", &time[i].t, &time[i].p );
35     sort( time, time+m );   // 对开门信息排序
36     priority_queue<Node> Q;
37     int order = 0;
38     int last = 0;
39     for( int i=0; i<m; i++ )    {
40         int t, p;   t = time[i].t;  p = time[i].p;
41         for( int i=last+1; i<=t; i++ )  {
42             Q.push( node[i] );
43         }
44         for( int i=0; i<p; i++ )    {
45             if( Q.empty() ) break;  // 注意当门外的人数比p小时--队列判空直接结束--否则会RE
46             Node nd = Q.top();  Q.pop();
47             order++;
48             strcpy( str[order], nd.name );
49         }
50         last = t;
51     }
52     for( int i=last+1; i<=k; i++ )  // m次开门后还要开门一次--门外所有人都进门
53         Q.push( node[i] );
54     while( !Q.empty() ) {
55         Node nd = Q.top();  Q.pop();
56         order++;
57         strcpy( str[order], nd.name );
58     }
59     bool fo = false;    // 输出格式
60     for( int i=1; i<=q; i++ )   {
61         int s;  scanf("%d", &s );
62         if( fo )    printf(" %s", str[s] );
63         else    {   printf("%s", str[s] ); fo = true; }
64     }
65     printf("\n");
66 }
67
68 int main()  {
69     int t;  scanf("%d", &t );
70     while( t-- )    {
71         solve();
72     }
73     return 0;
74 }

转载于:https://www.cnblogs.com/TaoTaoCome/p/4806837.html

HDU OJ 5437 Alisha’s Party 2015online A相关推荐

  1. [C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ

    前言 做过杭电.浙大或是北大等ACM题库的人一定对"刷题"不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到"Onl ...

  2. HDU oj 自动交题爬虫

    当我还在acm的时候就很想写这个爬虫了 后来学了python  学了点网页请求方式 然后就来写这个爬虫了 为了记录自己学习的过程写了这一系列博客 首先讲讲我的思路 第一步当然是登陆  和 cookie ...

  3. HDU OJ Super Jumping! Jumping! Jumping!

    Super Jumping! Jumping! Jumping! Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K ...

  4. HDU OJ 动态规划46题解析

    Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955  背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢 ...

  5. HDU oj wod sticks

    给大家推荐个靠谱的公众号程序员探索之路,大家一起加油 此题和南阳oj  动态规划  心急的C小加 一摸一样http://blog.csdn.net/yueloveme/article/details/ ...

  6. HDU OJ ACM Steps 上的题目详细介绍

    之前在杭电 OJ 上做题,看到有 ACM Steps 这个链接,进去之后发现是一个类似于闯关的机制,可以增加做题人的激情--据说完全通关后会有奖励,不知道是不是真的.但是里面没有题目的分类介绍,每一关 ...

  7. HDU OJ 1677 Nested Dolls【二分,LIS】

    原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1677 题意:每组测试数据给n个硬币,现在给你这n个硬币的长和高,若一硬币的长和高都小于另一个硬币,则这 ...

  8. hdu oj 2020 绝对值排序

    map的应用 输入n(n<=100)个整数,按照绝对值从大到小排序后输出.题目保证对于每一个测试实例,所有的数的绝对值都不相等. 1 import java.text.DecimalFormat ...

  9. 二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】

    二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1 ...

最新文章

  1. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
  2. Job for docker.service failed because the control process exited with error code. See systemctl sta
  3. Xshell 更改字体配色
  4. 详解Python的*args和 **kwargs
  5. 彻底解决zend studio 下 assignment in condition警告
  6. 【C#桌面应用】第二节:利用Visual Studio2019 创建桌面应用
  7. mysql 存储过程 输出table_mysql 存储过程 没有结果输出。
  8. 及部署 项目案例_盘点丨2019十大边缘计算项目
  9. Python调用C语言函数
  10. Url...................哈哈哈哈哈哈哈哈哈
  11. hdu 3951 博弈
  12. spring aop 切面执行顺序和常见问题
  13. 关于imcrop的一点注意事项
  14. Linux系统防火墙概述
  15. 数据分析-PART1--数据获取和步骤
  16. Vivado IP核之浮点数加减法 Floating-point
  17. linux越狱时手机怎么进入dfu,iOS详细越狱步骤 进入DFU模式_iPhone资讯_太平洋电脑网PConline...
  18. 关于js中e = e || window.event
  19. 3年收10亿,普陀山悄悄改名重启IPO
  20. 如何选择和阅读研究文献

热门文章

  1. insert into 多条数据_最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)
  2. Docker for Linux 安装
  3. Python_第一堂课
  4. 软工实践第三次作业(结对第一次作业)
  5. Django学习手册 - 创建Django工程项目以及APP
  6. node执行cmd命令方法
  7. loadrunner—参数化
  8. 【codeforces 711B】Chris and Magic Square
  9. 跨进程信息交互真个费事。
  10. [Android学习系列8]数据库ormlite笔记