博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-5437 Alisha’s Party
阅读量:4123 次
发布时间:2019-05-25

本文共 2238 字,大约阅读时间需要 7 分钟。

#include 
#include
#include
#include
#include
#include
using namespace std;const int k_max = 150000 + 5;const int m_max = 150000 + 5;const int q_max = 100 + 5;struct node1{ char name[205]; //记录姓名 int number; //记录进入顺序编号 int value; //记录礼物的价值 bool operator < (const node1 Next) const //优先队列的 优先级定义(和以前sort定义不同) { if(value == Next.value) return number > Next.number; else return value < Next.value; }} Friend[k_max];struct node2{ int open, amount; //记录在第几个人时开门 记录开门允许进来的人数 bool operator < (const node2 Next) const //sort排序定义 { return open < Next.open; }} door[m_max];int T, k, m, q;int query[q_max]; //记录查询的位置char ans[k_max][205]; //按顺序记录弹出的人名void party(){ priority_queue
process; //定义优先队列 int pos = 0; //pos跟着ans[]移动 int cnt = 0; //cnt跟着Fiend[]移动 for(int i = 0; i < m; i ++) { for(; Friend[cnt].number <= door[i].open; cnt ++) //Fiend编号 需小于 开门时的号码 process.push(Friend[cnt]); //让此时门外等着的人入队列 for(int j = 0; j < door[i].amount; j ++) //接下来就是模拟 door[i].amount个人 允许进门 { if(process.empty()) break; // 注意当门外的人数比amount小时--队列判空直接结束--否则会RE node1 temp = process.top(); process.pop(); //元素弹出 表示让他进门 strcpy(ans[pos], temp.name); //顺序记录进来的人名 pos ++; } } for(; cnt < k; cnt ++) //最后一次开门 让没进来的人全进来 process.push(Friend[cnt]); while(!process.empty()) //与上面相同 { node1 temp = process.top(); process.pop(); strcpy(ans[pos], temp.name); pos ++; }}int main(){ scanf("%d", & T); while(T --) { scanf("%d %d %d", & k, & m, & q); for(int i = 0; i < k; i ++) { scanf("%s %d", Friend[i].name, & Friend[i].value); Friend[i].number = i + 1; } for(int i = 0; i < m; i ++) scanf("%d %d", & door[i].open, & door[i].amount); sort(door, door + m); //必须对开门信息排序 party(); for(int i = 0; i < q; i ++) scanf("%d", & query[i]); for(int i = 0; i < q - 1; i ++) printf("%s ", ans[query[i] - 1]); //ans 是从 下标 0 开始 printf("%s\n", ans[query[q - 1] - 1]); } return 0;}

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

题解:

其实就是用优先队列。RE无数次。只因为 ans的数组开小了。我开成了q_max,应该是k_max。因为ans记录的是所有的进门人k个数据(最大是150000),之后query查询其中的q(最大是100)次而已,ans需全记录。还有就是这道题需要注意 必须对 开门door 按开门时间从小到大进行排序,因为题目并没有说按顺序(坑)。优先队列 在 struct的重载 和以前的不同。

转载地址:http://rctpi.baihongyu.com/

你可能感兴趣的文章
Java类文件中取得request、response、session的方法
查看>>
JS实现可编辑下拉框
查看>>
js网页定位,window,body元素的定位属性
查看>>
计算机编程简史图
查看>>
Myeclipse 快捷键大全
查看>>
properties文件读写自己写的方法
查看>>
properties文件读写自己写的方法
查看>>
Java保留小数问题
查看>>
java session HttpSessionListener、HttpSessionBindingListener使用区别,实现在线人数统计以及踢出用户
查看>>
Struts2 学习笔记——Action开发详解
查看>>
java 实现自动编译成json struts2 中不用配置json等jar包来实现低耦合,低入侵式ajax访问返回数据
查看>>
oracle数据库至少要启动的服务,以及常见错误的解决
查看>>
struts2 页面跳转控制传参问题
查看>>
Java中newString(abc)创建几个对象解释
查看>>
JS 刷新当前页面 返回上一页并刷新的方法
查看>>
SSH2项目搭建
查看>>
解压版Tomcat创建服务启动
查看>>
oracle 存储过程教程
查看>>
基于jquery框架、google chart tools图形报表gvChart的应用心得
查看>>
web项目快速原型设计
查看>>