题目
问题描述
蒜头君设计了一个任务系统。这个系统是为了定时提醒蒜头君去完成一些事情。
系统大致如下,初始的时候,蒜头君可能会注册很多任务,每一个任务的注册如下:
Register Q_num Period
表示从系统启动开始,每过 PeriodPeriod 秒提醒蒜头君完成编号为 Qnum 的任务。
你能计算出蒜头君最先被提醒的k 个任务吗?
输入格式
第一行输入n(0<n≤3000),k(0<k≤10000),其中n 表示蒜头君注册的任务数量。
接下来 n 行,每行输入一条注册命令,其中 0<qnum≤3000,0≤Period≤3000。
输出格式
顺序输出 k 行,表示依次提醒的任务的编号。
如果同一时间有多个任务,最先提醒编号小的任务。
样例输入
2 5
Register 2004 200
Register 2005 300
样例输出
2004
2005
2004
2004
2005
题解
题目是根据定时提醒蒜头君完成任务,首先创建一个结构体进行定义,再用队列解决。
代码:
#include<iostream>
#include<queue>
using namespace std;
struct inf {
int Q_num;
int Period;
int standard;
bool operator < (const inf & a)const { // 重载 从小到大
if (Period != a.Period)
return Period > a.Period;
else
return Q_num > a.Q_num;
}
};
int main() {
priority_queue<inf> q;
int n, k;
inf tmp;
string str;
int tQ_num;
int tPeriod;
cin >> n >> k;
while (n--) {
cin >> str >> tQ_num >> tPeriod;
tmp.Q_num = tQ_num;
tmp.Period = tPeriod;
tmp.standard = tPeriod;
q.push(tmp);
}
while (k--) {
tmp = q.top();
q.pop();
cout << tmp.Q_num << endl;
tmp.Period += tmp.standard;
q.push(tmp);
}
return 0;
}