设计了一个任务系统。这个系统是为了定时提醒人们去完成一些事情。
系统大致如下,初始的时候,人们可能会注册很多任务,每一个任务的注册如下:
Register Q_num Period
表示从系统启动开始,每过 Period 秒提醒人们完成编号为 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<algorithm>
#include<queue>
#include<map>
using namespace std;
struct task{
int num,time;
bool operator<(const task &A)const{
if(time==A.time)return num>A.num;
return time>A.time;
}
};
map<int,int>m;
int main(){
priority_queue<task>q;
int n,k;cin>>n>>k;
while(n--){
string s;cin>>s;
task ts;
cin>>ts.num>>ts.time;
q.push(ts);
m[ts.num]=ts.time;
}
while(k--){
task gru;
gru=q.top();q.pop();
gru.time+=m[gru.num];
q.push(gru);
cout<<gru.num<<endl;
}
return 0;
}