问题描述:
蒜头君设计了一个任务系统。这个系统是为了定时提醒蒜头君去完成一些事情。
系统大致如下,初始的时候,蒜头君可能会注册很多任务,每一个任务的注册如下:
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
代码解析:
//
// main.cpp
// renwuxitong
//
// Created by apple on 2018/3/15.
// Copyright © 2018年 apple. All rights reserved.
//
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
/*
定义一个结构体
*/
struct Node{
int Q,period,period_o;//period_o为变化的值
//重点,权值小的在前,相同时间,比编号,小的在前
bool operator<(const Node &rhs)const{
return period_o>rhs.period_o || (period_o==rhs.period_o && Q>rhs.Q);
}
};
int main() {
priority_queue<Node> q;
Node node;
int n,k;//n个任务,k个值
cin>>n>>k;
string s;//
int a,b;//
//赋初值
for(int i=0;i<n;i++){
cin>>s>>a>>b;
node.Q=a;
node.period=b;
node.period_o=b;
q.push(node);
}
//output
for(int i=0;i<k;i++){
node=q.top();
q.pop();
cout<<node.Q<<endl;
//时间变化
node.period_o+=node.period;
q.push(node);
}
return 0;
}