题目
蒜头君设计了一个任务系统。这个系统是为了定时提醒蒜头君去完成一些事情。
系统大致如下,初始的时候,蒜头君可能会注册很多任务,每一个任务的注册如下:
Register Q_num Period
表示从系统启动开始,每过 秒提醒蒜头君完成编号为 的任务。
你能计算出蒜头君最先被提醒的 个任务吗?
输入格式
第一行输入 , ,其中 表示蒜头君注册的任务数量。
接下来 行,每行输入一条注册命令,其中 , 。
输出格式
顺序输出 行,表示依次提醒的任务的编号。
如果同一时间有多个任务,最先提醒编号小的任务。
样例输入
5
Register 2004 200
Register 2005 300
样例输出
2004
2005
2004
2004
2005
题解
以 Period 为初始值,每次出队 Period 最小的一组任务,再将 Period 加上初始值入队
#include<iostream>
#include<queue>
using namespace std;
struct inf{
int Q_num;
int Period;
int init; // 初始
bool operator < (const inf & a)const{ // 重载 从小到大
if(Period != a.Period)
return Period > a.Period;
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.init = tPeriod;
q.push(tmp);
}
while (k--) {
tmp = q.top();
q.pop();
cout<<tmp.Q_num<<endl;
tmp.Period += tmp.init;
q.push(tmp);
}
return 0;
}