ACM解题之(ZOJ 2212) Argus
题目来源:
题目翻译:
数据流是实时的,连续的,有序的项目序列。一些例子包括传感器数据,互联网流量,金融代码,在线拍卖以及诸如网络使用日志和电话记录之类的交易日志。同样,对流进行的查询在一段时间内连续运行,并在新数据到达时递增返回新结果。例如,工厂仓库的温度检测系统可以运行如下的查询。
查询-1: 每五分钟,检索过去五分钟内的最高温度
查询-2: 返回过去10分钟内每层测得的平均温度
我们开发了一个名为Argus的数据流管理系统,它处理数据流上的查询。用户可以向Argus注册查询。 Argus将保持查询在不断变化的数据上运行,并将结果以所需的频率返回给相应的用户。
对于Argus,我们使用以下指令来注册查询: 注册 Q_num 周期
Q_num(0 <Q_num <= 3000)是查询ID号码,而周期(0 <期间<= 3000)是结果的两个连续返回之间的间隔。在注册周期的第几秒后,结果将首次返回,之后,结果将每隔一个周期返回一次。 这里我们有几个不同的查询在Argus一次注册。保证所有的查询都有不同的Q_num。你的任务是输出前K个查询结果。如果两个或多个查询要同时返回结果,它们将按Q_num的升序顺序返回结果。
输入:输入的第一部分是对Argus的注册指令,每行一条指令。您可以假设指令的数量不会超过1000,并且所有这些指令都是同时执行的。这部分以一行 # 结束。 第二部分是你要输出的结果数。该部分只包含一行,即一个正整数K(<= 10000)。
输出:您应输出前K个查询的Q_num的返回结果,每行一个数字。
Sample Input
Register 2004 200
Register 2005 300
#
5
SampleOutput
2004
2005
2004
2004
2005
这道题的意思时,注册一个查询的时候给定这个查询一个周期,然后实现周期性查找。例如输入‘Register 2004 200’,则每隔200个单位时间,就会重复执行ID为2004的查询(这里即输出2004);输入‘Register 2005 300’,则每隔300秒就会执行ID为2005的查询(这里即输出2005)。所以同时输入上述两个命令,就会得到2004(200s时),2005(300s时),2004(400s时),2004(600s时),2005(600时后)。。。600s时会先输出2004,因为题目说了同时输出时,会按ID号的升序输出!
这个题目和我上一篇的windows消息处理的题目很类似,都是要比较两个指标的大小,当主指标一样时,比较次指标,而且这两个题都规定了次指标一定不一样!所以,这道题我还是用了优先队列来做。
首先定义一个任务结构,每个任务对象包括三个整形数,一个表示ID号,一个表示周期,一个表示当前时间时间。然后写一个重载<函数,定义任务点的大小比较规则:符合输出的当前时间一样时,比较ID号;符合输出的当且时间不一样时,比较当前时间。
具体看代码:
/*
c++/accepted
*/
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct node { //定义任务点结构
int p, t, p_num;
bool friend operator < (node a, node b) {
if (a.t == b.t)
return a.p_num > b.p_num; //如果当前输出时间一样,则比较ID号
return a.t > b.t; //否则直接比较当前输出时间
}
}an;
int main() {
string ss;
priority_queue<node> q; //申请一个node的优先队列
int k;
cin >> ss; //输入Register或#
while (ss!="#") { //如果输入的ss不为'#",则继续输入
cin >> an.p_num; //输入ID号
cin >> an.p; //输入周期
an.t = an.p; //把当前输出时间初始化为周期,因为一个周期后才输出
q.push(an); //把任务点push进队列
cin >> ss; //输入Register或#
}
cin >> k; //输入k
while(k--)
{
an = q.top(); //取出队列头对象
cout << an.p_num << endl; //输出当前任务的ID
an.t = an.t + an.p; //更新当前任务的输出时间为原时间加上该任务的周期,因为此任务的下次输出要等一个周期
q.pop(); //让第一个对象出队
q.push(an); //把更新了的任务进队
} //直到输出够k个
return 0;
}
ACM解题之(ZOJ 2212) Argus的更多相关文章
- ACM解题之(ZOJ 2724)Windows Message Queue
题目来源: 点击打开链接 题目翻译: 消息队列是windows系统的基本基础.对于每个进程,系统都维护一个消息队列.如果这个过程发生某些事情,例如鼠标点击,文本改变,系统会向队列添加一条消息.同时,如 ...
- ACM解题之(ZOJ 1094) Matrix Chain Multiplication
题目来源: 点击打开链接 题目翻译: 矩阵乘法问题是动态规划的典型例子. 假设你必须评估一个表达式,如A * B * C * D * E,其中A,B,C,D和E是矩阵.由于矩阵乘法是关联的,乘法运算的 ...
- ACM解题之在线翻译 Give Me the Number
Give Me the Number Time Limit: 2 Seconds Memory Limit: 65536 KB ...
- 山东省第四届acm解题报告(部分)
Rescue The PrincessCrawling in process... Crawling failed Description Several days ago, a beast ca ...
- ACM解题之快速输出杨辉三角形(前68行)
题意: 本题要求计算并输出杨辉三角形的前 68 行. Time Limit:1000MS Memory Limit:65536K 解题: 为了能在规定时间准确输出杨辉三角形的前68行,这里我用了精准的 ...
- ACM解题之素矩阵
题意: 如果一个矩形的两条边都是素数,则称此矩形为素矩形.本题给出一个素矩形的面积,请计算其两条边的值.有多个测试用例.每个用例占一行,包含一个表示素矩形面积且不超过 108 的正整数.输入直至没有数 ...
- ACM解题之回文序列
题意: 一个长度为 n 的序列 a1, m2, ..., an-1, an,如果 ai = an-i+1, i = 1, 2, ..., n,则称之为"回文序列".本题对于给定的一 ...
- ACM学习历程—ZOJ 3868 GCD Expectation(莫比乌斯 || 容斥原理)
Description Edward has a set of n integers {a1, a2,...,an}. He randomly picks a nonempty subset {x1, ...
- ACM学习历程—ZOJ 3777 Problem Arrangement(递推 && 状压)
Description The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem sett ...
随机推荐
- 206. Reverse Linked List【easy】
206. Reverse Linked List[easy] Reverse a singly linked list. Hint: A linked list can be reversed eit ...
- js基础系列框架图 (转载)
- tomcat各目录下的作用
1.tomcat的主目录下的文件 bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令). 重要: 很多环 ...
- constructors and destructors
A constructor is a method that gets called immediately when an object is allocated (on the stack or ...
- Vim使用技巧(2) -- 插入模式技巧 【持续更新】
组合快捷键 Ctrl + h //删除前一个字母(同退格键) Ctrl + w //删除前一个单词 Ctrl + u //删除到行首 Esc //切换到普通模式 Ctrl + [ //切换到普通模式 ...
- 虚拟化笔记04.OpenFiler.install
4.OpenFiler install OPENFILER 介绍 1.OpenFiler 作用 OpenFiler 基于Linux 内核,主要作用是实现IP-SAN. 在VSPHERE中我们可以将VM ...
- mysql 1005 错误
建立外键的时候两个 表的相对应的 类型不一致!
- [已解决]windows下python3.x与python2.7共存版本pip使用报错问题
> 由于最近要更新插件,突然发现没法使用pip来安装升级插件,查了一圈才找到解决办法,特记录在此,便于其它人查询. 报错信息如下: Fatal error in launcher: Unable ...
- spring mvc3.1 @ResponseBody注解生成大量Accept-Charset
Spring3 MVC使用@ResponseBody后会产生非常大的响应头(Accept-Charset会达到4K+).原因在于默认情况下StringHttpMessageConverter.writ ...
- android实现卸载提示
这篇文章是整理的以前用过的一个功能,由于多种原因现在停用了,也希望这篇文章能帮助一些android入门的小童鞋.android是不提供监控卸载自己的功能的,这里使用了监控android日志的功能,an ...