当前位置: 代码迷 >> 综合 >> UVA1203 Argus 优先队列
  详细解决方案

UVA1203 Argus 优先队列

热度:18   发布时间:2024-01-15 07:24:31.0

题意翻译

题目描述
一个数据流是一个实时,连续,有序的条目序列。一些实例包括传感器数据,互联网贸易,金融报价,网上拍卖,交易日志,Web使用日志和电话呼叫记录。同样,在数据流上的查询每隔一定时间就要连续运行,在产生新的数据的时候就要产生新的结果。例如,一家工厂的仓库的温度检测系统可以执行如下的查询:
查询- 1:“每五分钟,检索在过去5分钟内的最高温度。” 
查询- 2:“返回在过去10分钟各个楼层的平均气温。”
我们开发了一个名为Argus的数据流管理系统,以处理在数据流上的查询。用户可以在Argus上登记查询。 Argus将在不断变化的数据上持续执行查询,并以要求的频率向相应的用户返回结果。
对Argus,我们以下述的指令来登记查询:
Register Q_num Period
Q_num (0 < Q_num <= 3000)是查询的ID编号,Period (0 < Period <= 3000)是两个连续的查询结果返回之间的时间间隔。在登记了Period秒之后,首次返回结果,此后,每隔Period秒返回结果。
在Argus上登记了几个不同的查询,所有的查询都有不同的Q_num。你的任务是给出前K个返回结果的查询。如果两个或多个查询同时返回结果,则将他们按照Q_num的升序进行排列。输入
输入的第一部分是在Argus上登记的指令,一条指令占一行,假定指令的编号不超过1000,并且所有的指令同时开始执行。这一部分的结束用“#”表示。
第二部分是你的工作,只有一行,给出一个正整数K (<= 10000)。输出
输出前K个返回结果的查询的Q_num,每个数字一行。
样例输入Register 2004 200
Register 2005 300
#
5样例输出2004
2005
2004
2004
2005

题目描述

PDF

输入输出格式

输入格式:

 

输出格式:

 

输入输出样例

暂无测试点

题意难懂一些,

题意:

     多个命令,每个命令如Register 2004 200 对应于编号为2004的事件,每隔200秒发生一次(首次发生是在200秒).然后在给你一个K,要你输出前K个发生事件的编号.如果几个事件同时发生,输出事件编号小的.

优先队列即可。


#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{int id,t,period;node(int id,int t,int p):id(id),t(t),period(p){}bool operator < (const node& a) const{return t>a.t||(t==a.t&&id>a.id);}
};
int main()
{string s;priority_queue<node> pq;while(cin>>s){if(s[0]=='#')break;int i1,t2;scanf("%d%d",&i1,&t2);pq.push(node(i1,t2,t2));}int k;scanf("%d",&k);while(k--){node temp=pq.top();pq.pop();printf("%d\n",temp.id);temp.t+=temp.period;pq.push(temp);}return 0;
}