当前位置:网站首页>2022杭电杯超级联赛(5)
2022杭电杯超级联赛(5)
2022-08-05 10:29:00 【right_135】
1012 Buy Figurines
题解:需要两个优先队列,一个优先队列存储 正在购物的人的结束时间和所属队伍编号,另一个优先队列存储队伍信息(队伍编号,人数,最晚结束时间,以及队伍信息编号 信息编号越大表示队伍信息越新,老的队伍信息不可以用,碰到直接删除,保证使用的队伍信息必须是该队伍最新的信息),每个人来的时候,需要先看第一个优先队列 中有没有人要走了,走的话需要更新对应队伍的信息,并将新的队伍信息放到第二个优先队列中,然后再看队伍信息,找到第一个最新的队伍信息,将该人排到该队列后面即可。然后看时间最久的一个人的结束时间即可。
通过优先队列可以快速找到最符合条件的队伍,进而减少时间复杂度。
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
struct student {
//人
int a,s;//a 到达时间 s 购物时间
int time;//结束时间
int num;//该人在哪只队伍
bool operator<(const student &a)const {
return time>a.time;
}
};
student stu[1000006];//保存人的信息
int sum[1000005];//保存各个队伍当前的总人数
bool cmp(student &a,student &b) {
//按照人到达的时间排序
return a.a<b.a;
}
struct quq {
//队伍信息
int num,idx;//队伍编号 队伍idx
int sum;//队伍人数
bool operator<(const quq &a)const {
if(sum!=a.sum)
return sum>a.sum;//如果人不相等 则人少的排在前面
if(num!=a.num) {
return num>a.num;//如果人数相等 编号小的在前面
}
return idx<a.idx;//如果编号也相等 则表示同一只队伍 则最新的队伍信息--idx大的 在前面
}
};
priority_queue<quq>q1;//队伍信息的 优先队列
priority_queue<student>st;//正在购物的人员信息的优先队列
ll js[1000006];//记录各个队伍当前最后一名的结束时间
int id[1000005];//记录队伍的最新idx
void solve() {
int n,m;
while(q1.size())q1.pop();
while(st.size())st.pop();
memset(js,0,sizeof(js));
memset(id,0,sizeof(id));
memset(sum,0,sizeof(sum));
memset(stu,0,sizeof(stu));
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++) {
scanf("%d%d",&stu[i].a,&stu[i].s);
}
for(int i=0; i<m; i++) {
quq qu;//初始化m只队伍信息
qu.num=i;//队伍编号
qu.idx=0;//队伍idx
qu.sum=0;//队伍没有人
q1.push(qu);
}
sort(stu,stu+n,cmp);//按照人物到达时间排序 从小到大
ll ma=0;
for(int i=0; i<n; i++) {
ll t=stu[i].a;//当前人的到达时间
while(st.size()) {
student s1=st.top();//正在购物 人的信息
if(s1.time<=t) {
// 购物时间到达 则该人应该走了 它所对应的队伍信息需要更新
st.pop();
sum[s1.num]--;//对应队伍的人数需要-1
quq temp;
temp.sum=sum[s1.num];
temp.idx=++id[s1.num];//队伍的idx需要+1
temp.num=s1.num;//队伍的编号
q1.push(temp);
} else {
break;
}
}
while(q1.size()) {
quq temp=q1.top();
if(temp.idx!=id[temp.num]) {
//如果该队伍已经不是该队伍的最新信息了..
q1.pop();
} else {
q1.pop();
temp.idx=++id[temp.num];//队伍idx+1;
t=max(t,js[temp.num]);//看人员的真实开始时间
t+=stu[i].s;
stu[i].time=t;//人员的结束时间
stu[i].num=temp.num;//人员所在的队伍编号
st.push(stu[i]); //进入购物
ma=max(ma,t);
js[temp.num]=t;//队伍的结束时间更新
sum[temp.num]++;//队伍的人数+1
temp.sum=sum[temp.num];
q1.push(temp);
break;
}
}
}
cout<<ma<<'\n';
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
solve();
}
}
边栏推荐
- Common operations of oracle under linux and daily accumulation of knowledge points (functions, timed tasks)
- 创建一个 Dapp,为什么要选择波卡?
- 教你本地编译运行一个IDEA插件,在IDEA里聊天、下棋、斗地主!
- Ali's new launch: Microservices Assault Manual, all operations are written out in PDF
- 数据可视化(一)
- GCC编译的时候头文件搜索规则
- FPGA:基础入门按键控制LED灯
- E-sports, convenience, efficiency, security, key words for OriginOS functions
- Technical dry goods | Hausdorff distance for image segmentation based on MindSpore
- nyoj754 黑心医生 结构体优先队列
猜你喜欢

多线程(进阶) - 2.5w字总结

2022 Huashu Cup Mathematical Modeling Question A Optimization Design Ideas for Ring Oscillators Code Sharing

Common operations of oracle under linux and daily accumulation of knowledge points (functions, timed tasks)

【综合类型第 35 篇】程序员的七夕浪漫时刻

Complete image segmentation efficiently based on MindSpore and realize Dice!

气象数据数据处理实例——matlab字符串切割匹配与R语言日期匹配(数据拼接)

【MindSpore Easy-Diantong Robot-01】You may have seen many knowledge quiz robots, but this one is a bit different

项目成本控制如何帮助项目成功?

上位机开发C#语言:模拟STC串口助手接收单片机发送数据

How can project cost control help project success?
随机推荐
Use KUSTO query statement (KQL) to query LOG on Azure Data Explorer Database
three物体围绕一周呈球形排列
还在找网盘资源吗?快点收藏如下几个值得收藏的网盘资源搜索神器吧!
NowCoderTOP35-40 - continuous update ing
Latex如何控制表格的宽度和高度
three.js debugging tool dat.gui use
Introduction to SD NAND Flash!
技术干货 | 基于 MindSpore 实现图像分割之豪斯多夫距离
uniapp中的view高度设置100%
产品太多了,如何实现一次登录多产品互通?
GCC编译的时候头文件搜索规则
uniapp 连接ibeacon
如何测试一下现场的备机失败,转发主机的场景?
2022 Huashu Cup Mathematical Modeling Ideas Analysis and Exchange
第六章:activiti流程分流判断之排它网关和并行网关
数分面试(一)----与业务相关
012年通过修补_sss_提高扩散模型效率
导火索:OAuth 2.0四种授权登录方式必读
数据可视化(二)
Leetcode刷题——623. 在二叉树中增加一行