HDU OJ 5437 Alisha’s Party 2015online A
题目: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相关推荐
- [C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ
前言 做过杭电.浙大或是北大等ACM题库的人一定对"刷题"不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到"Onl ...
- HDU oj 自动交题爬虫
当我还在acm的时候就很想写这个爬虫了 后来学了python 学了点网页请求方式 然后就来写这个爬虫了 为了记录自己学习的过程写了这一系列博客 首先讲讲我的思路 第一步当然是登陆 和 cookie ...
- HDU OJ Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping! Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K ...
- HDU OJ 动态规划46题解析
Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢 ...
- HDU oj wod sticks
给大家推荐个靠谱的公众号程序员探索之路,大家一起加油 此题和南阳oj 动态规划 心急的C小加 一摸一样http://blog.csdn.net/yueloveme/article/details/ ...
- HDU OJ ACM Steps 上的题目详细介绍
之前在杭电 OJ 上做题,看到有 ACM Steps 这个链接,进去之后发现是一个类似于闯关的机制,可以增加做题人的激情--据说完全通关后会有奖励,不知道是不是真的.但是里面没有题目的分类介绍,每一关 ...
- HDU OJ 1677 Nested Dolls【二分,LIS】
原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1677 题意:每组测试数据给n个硬币,现在给你这n个硬币的长和高,若一硬币的长和高都小于另一个硬币,则这 ...
- hdu oj 2020 绝对值排序
map的应用 输入n(n<=100)个整数,按照绝对值从大到小排序后输出.题目保证对于每一个测试实例,所有的数的绝对值都不相等. 1 import java.text.DecimalFormat ...
- 二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】
二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1 ...
最新文章
- 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
- Job for docker.service failed because the control process exited with error code. See systemctl sta
- Xshell 更改字体配色
- 详解Python的*args和 **kwargs
- 彻底解决zend studio 下 assignment in condition警告
- 【C#桌面应用】第二节:利用Visual Studio2019 创建桌面应用
- mysql 存储过程 输出table_mysql 存储过程 没有结果输出。
- 及部署 项目案例_盘点丨2019十大边缘计算项目
- Python调用C语言函数
- Url...................哈哈哈哈哈哈哈哈哈
- hdu 3951 博弈
- spring aop 切面执行顺序和常见问题
- 关于imcrop的一点注意事项
- Linux系统防火墙概述
- 数据分析-PART1--数据获取和步骤
- Vivado IP核之浮点数加减法 Floating-point
- linux越狱时手机怎么进入dfu,iOS详细越狱步骤 进入DFU模式_iPhone资讯_太平洋电脑网PConline...
- 关于js中e = e || window.event
- 3年收10亿,普陀山悄悄改名重启IPO
- 如何选择和阅读研究文献