任务系统
题目描述
蒜头君设计了一个任务系统。这个系统是为了定时提醒蒜头君去完成一些事情。
系统大致如下,初始的时候,蒜头君可能会注册很多任务,每一个任务的注册如下:
R e g i s t e r Register Register Q n u m Q_{num} Qnum P e r i o d Period Period
表示从系统启动开始,每过 Period 秒提醒蒜头君完成编号为 Qnum 的任务。
你能计算出蒜头君最先被提醒的 k 个任务吗?
输入描述
第一行输入 n,k,其中 n 表示蒜头君注册的任务数量。
接下来 n 行,每行输入一条注册命令。
输出描述
顺序输出 k 行,表示依次提醒的任务的编号。如果同一时间有多个任务,最先提醒编号小的任务。
用例输入 1
2 5
Register 2004 200
Register 2005 300
用例输出 1
2004
2005
2004
2004
2005
数据规模与约定
0
<
n
≤
3000
0<n≤3000
0<n≤3000,
0
<
k
≤
10000
0<k≤10000
0<k≤10000,
0
<
Q
n
u
m
≤
3000
0<Q_{num}≤3000
0<Qnum≤3000,
0
≤
P
e
r
i
o
d
≤
3000
0≤Period≤3000
0≤Period≤3000。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
int num, time; // 任务的编号和时间
bool operator>(const node &a) const // 重载>运算符,根据时间排序,同一时间则编号小优先
{
if (time == a.time)
return num > a.num;
else
return time > a.time;
}
};
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, k, q, p; // n为任务数量,输出前k个任务编号,q存储读入的编号,p存储读入的间隔时间
cin >> n >> k;
string s;
node x;
priority_queue<node, vector<node>, greater<node>> pq; // 根据时间排序的小根堆
unordered_map<int, int> mp; // 利用map保存任务编号相对应的间隔时间,构建二者的映射
while (n--)
{
cin >> s >> q >> p;
mp[q] = p;
x.num = q;
x.time = p;
pq.push(x);
}
while (k--)
{
x = pq.top();
pq.pop();
cout << x.num << '\n';
x.time += mp[x.num]; // 每取了一个时间最小的任务,需将其加上对应的时间间隔后重新加入小根堆中
pq.push(x);
}
return 0;
}