[ABC423D]Long Waiting题解
这是一道关于餐厅顾客进出管理的模拟题。题目描述一个最多容纳K人的餐厅,N组顾客按时间顺序到达并排队。每组顾客在同时满足两个条件时才能进入餐厅:1)位于队首;2)当前餐厅人数+该组人数不超过K。需要计算每组进入餐厅的时间。 解题思路是使用优先队列管理正在用餐的顾客,按离开时间排序。维护当前餐厅人数,当新顾客到达时,若餐厅已满,则不断移除最早离开的顾客直到有空位。时间复杂度为O(N log N),适合
·
时间限制:2 秒 / 内存限制:1024 MiB
得分: 400 分
《A - 回文数》《A - 回文数》《A - 回文数》
问题描述
有一家餐厅最多可以同时容纳 K 名顾客。在这家餐厅前有一条侧街,那里有一个排队系统。
在时间 0 时,餐厅内没有顾客,队列为空。
今天,有 N 组顾客计划到来,他们按到达顺序编号从 1 到 N 。第 i 组有 Ci 人,在时间 Ai 加入队伍的末尾,并在进入后经过 Bi 时间单位离开餐厅。
每一组顾客在同时满足以下两个条件时,最早离开队列进入餐厅:
- 该组位于队列的最前面。换句话说,在那一刻仍然在队列中的组中,该组是最早加入的。
- 当将该组的人数与当前在餐厅中的所有组的人数相加时(包括正好在该时刻进入的人数,不包括离开的人数),总人数为 K 或更少。
找出每个组进入餐厅的时间。
《A - 回文数》《A - 回文数》《A - 回文数》
约束条件
- 1≤N≤3×105
- 1≤K≤107
- 1≤Ai,Bi≤107 (1≤i≤N)
- A1<⋯<AN
- 1≤Ci≤K (1≤i≤N)
- 所有输入值都是整数。
《A - 回文数》《A - 回文数》《A - 回文数》
输入
输入从标准输入中按以下格式给出:
N K
A1 B1 C1
⋮
AN BN CN
《A - 回文数》《A - 回文数》《A - 回文数》
输出
输出 N 行。第 i 行( 1≤i≤N )应包含组 i 进入餐厅的时间,以整数形式表示。
《A - 回文数》《A - 回文数》《A - 回文数》
示例输入 1 复制
复制
4 10
30 300 3
60 45 4
90 45 5
120 45 2
《A - 回文数》《A - 回文数》《A - 回文数》
示例输出 1 复制
复制
30
60
105
120
每组进出流程如下:
- 在时间 30 时,小组 1 加入队列并立即进入,使餐厅中的顾客数量为 3 。
- 在时间 60 时,小组 2 加入队列并立即进入,使餐厅中的顾客数量为 7 。
- 在时间 90 时,小组 3 加入队列。
- 在时间 105 时,小组 2 离开,使餐厅中的顾客数量变为 3 。紧接着,小组 3 进入,使餐厅中的顾客数量变为 8 。
- 在时间 120 时,小组 4 加入队列并立即进入,使餐厅中的顾客数量变为 10 。
- 在时间 150 时,小组 3 离开,使餐厅中的顾客数量变为 5 。
- 在时间 165 时,小组 4 离开,使餐厅中的顾客数量变为 3 。
- 在时间 330 时,小组 1 离开,使得餐厅中的顾客数量为 0 。
《A - 回文数》《A - 回文数》《A - 回文数》
样本输入 2 复制
复制
4 10
30 300 10
60 45 2
90 45 3
120 45 4
《A - 回文数》《A - 回文数》《A - 回文数》
样本输出 2 复制
复制
30
330
330
330
每个小组的进入和离开按以下方式进行:
- 在时间 30 时,小组 1 加入队列并立即进入,使得餐厅中的顾客数量为 10 。
- 在时间 60 时,小组 2 加入队列。
- 在时间 90 时,组 3 加入队列。
- 在时间 120 时,组 4 加入队列。
- 在时间 330 时,组 1 离开,使餐厅中的顾客数量为 0 。紧接着,组 2,3,4 进入,使餐厅中的顾客数量为 9 。
- 在时间 375 时,组 2,3,4 离开,使餐厅中的顾客数量为 0 。
《A - 回文数》《A - 回文数》《A - 回文数》
示例输入 3Copy
复制
10 24
279290 9485601 1
1094410 8022270 4
1314176 7214745 5
1897674 5924694 10
1921802 5769841 4
2506394 2765234 2
2558629 2727489 9
2681289 4061363 5
3022540 2291905 3
4407692 1313036 8
《A - 回文数》《A - 回文数》《A - 回文数》
Sample Output 3
复制
279290
1094410
1314176
1897674
1921802
7691643
7822368
8528921
8528921
10549857
思路
注意到必定有序,所以将所有人加入堆,每次若不满足,则删堆顶直到满足。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[300005],b[300005],c[300005],lk=0,kl=0;
struct one{
long long a,b,c,d;
}aa[300005];
priority_queue<one> q;
bool operator<(one a1,one b1){
return a1.d>b1.d;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
aa[i].a=a[i];
aa[i].b=b[i];
aa[i].c=c[i];
}
lk=0;
for(int i=1;i<=n;i++){
while(lk+c[i]>=k+1){
kl=max(kl,q.top().d);
lk-=q.top().c;
q.pop();
}
q.push({0,0,c[i],max(a[i],kl)+b[i]});
lk+=c[i];
cout<<max(a[i],kl)<<endl;
}
return 0;
}
更多推荐
所有评论(0)