蒜头君设计了一个任务系统。这个系统是为了定时提醒蒜头君去完成一些事情。
系统大致如下,初始的时候,蒜头君可能会注册很多任务,每一个任务的注册如下:
Register Qnum Period
表示从系统启动开始,每过 秒提醒蒜头君完成编号为 的任务。
你能计算出蒜头君最先被提醒的 个任务吗?
输入格式
第一行输入 , ,其中 表示蒜头君注册的任务数量。
接下来 行,每行输入一条注册命令,其中 , 。
输出格式
顺序输出 行,表示依次提醒的任务的编号。
如果同一时间有多个任务,最先提醒编号小的任务。
样例输入
5
Register 2004 200
Register 2005 300
样例输出
2004
2005
2004
2004
2005
解:
优先队列详解:【原创】优先队列 priority_queue 详解
用一个vectot保存任务信息,在某一元素推出队列后,把时间+=上vector中保存的原有信息的时间,再入队,来达到顺序执行。
代码:
#include"iostream"
#include"string"
#include"vector"
#include"queue"
#include"algorithm"
using namespace std;
struct node{
int time,num;
bool operator>(const node& a)const{//升序排列
if(time>a.time)//按时间升序
return true;
else if(time==a.time)
return (num>a.num);//时间相同按编号升序
else return false;//这句必须要
}
};
int main()
{
int n,k;
string w;
priority_queue<node,vector<node>,greater<node> > a;
vector<node> data;//数据保存
cin>>n>>k;
node temp;
for(int i=0;i<n;i++){
cin>>w;
cin>>temp.num>>temp.time;
a.push(temp);
data.push_back(temp);
}
while(k){
temp=a.top();
cout<<temp.num<<endl;
for(int i=0;i<data.size();i++){
if(data[i].num==temp.num){
temp.time+=data[i].time;
//cout<<"****"<<temp.time<<endl;
}
}
a.pop();
a.push(temp);
k--;
}
return 0;
}