任务系统 - 计蒜客

蒜头君设计了一个任务系统。这个系统是为了定时提醒蒜头君去完成一些事情。

系统大致如下,初始的时候,蒜头君可能会注册很多任务,每一个任务的注册如下:

Register Qnum Period

表示从系统启动开始,每过 P e r i o d Period 秒提醒蒜头君完成编号为 Q n u m Q_{num} 的任务。

你能计算出蒜头君最先被提醒的 k k 个任务吗?

输入格式

第一行输入 n ( 0 < n 3000 ) n(0 < n \le 3000) k ( 0 < k 10000 ) k(0 < k \le 10000) ,其中 n n 表示蒜头君注册的任务数量。

接下来 n n 行,每行输入一条注册命令,其中 0 < q n u m 3000 0 < q_{num} \le 3000 0 P e r i o d 3000 0 \le Period \le 3000

输出格式

顺序输出 k k 行,表示依次提醒的任务的编号。

如果同一时间有多个任务,最先提醒编号小的任务。

样例输入

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;
}

猜你喜欢

转载自blog.csdn.net/qq_43508196/article/details/86630752