当前位置:网站首页>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();
}
}
边栏推荐
- FPGA: Use of the development environment Vivado
- 一张图看懂 SQL 的各种 join 用法!
- MySQL之数据视图
- 用户考试分数大于单科科目平均分的查询
- This notebook of concurrent programming knowledge points strongly recommended by Ali will be a breakthrough for you to get an offer from a big factory
- Data Middle Office Construction (10): Data Security Management
- R语言ggplot2可视化:可视化密度图(Density plot)、可视化多个分组的密度图、数据点分布在箱图中间、添加主标题、副标题、题注信息
- Opencv算术操作
- 智能算力的枢纽如何构建?中国云都的淮海智算中心打了个样
- Chapter 4: In the activiti process, variable transmission and acquisition process variables, setting and acquiring multiple process variables, setting and acquiring local process variables "recommende
猜你喜欢
2022 Huashu Cup Mathematical Modeling Question A Optimization Design Ideas for Ring Oscillators Code Sharing
Getting started with Polkadot parachain development, this article is enough
FPGA: Use of the development environment Vivado
高质量 DeFi 应用构建指南,助力开发者玩转 DeFi Summer
In-depth understanding of timeout settings for Istio traffic management
Complete image segmentation efficiently based on MindSpore and realize Dice!
这份阿里强推的并发编程知识点笔记,将是你拿大厂offer的突破口
产品太多了,如何实现一次登录多产品互通?
SQL Outer Join Intersection, Union, Difference Query
基于MindSpore高效完成图像分割,实现Dice!
随机推荐
js hijacks the array push method
2022华数杯数学建模A题环形振荡器的优化设计思路思路代码分享
FPGA:基础入门按键控制LED灯
Chapter 4: activiti RuntimeService settings get and get process variables, and the difference from taskService, set process variables when starting and completing tasks [easy to understand]
poj2287 Tian Ji -- The Horse Racing(2016xynu暑期集训检测 -----C题)
SMB + SMB2: Accessing shares return an error after prolonged idle period
力扣(LeetCode)216. 组合总和 III(2022.08.04)
Confessing in the era of digital transformation: Mai Cong Software allows enterprises to use data in the easiest way
数据中台建设(十):数据安全管理
SkiaSharp 之 WPF 自绘 投篮小游戏(案例版)
你最隐秘的性格在哪?
RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)
第五章:多线程通信—wait和notify
单片机:温度控制DS18B20
Still looking for a network backup resources?Hurry up to collect the following network backup resource search artifact it is worth collecting!
E-sports, convenience, efficiency, security, key words for OriginOS functions
[Android]如何使用RecycleView in Kotlin project
Where is your most secretive personality?
【MindSpore Easy-Diantong Robot-01】You may have seen many knowledge quiz robots, but this one is a bit different
电竞、便捷、高效、安全,盘点OriginOS功能的关键词