题目来源:

点击打开题目

题目翻译:

数据流是实时的,连续的,有序的项目序列。一些例子包括传感器数据,互联网流量,金融代码,在线拍卖以及诸如网络使用日志和电话记录之类的交易日志。同样,对流进行的查询在一段时间内连续运行,并在新数据到达时递增返回新结果。例如,工厂仓库的温度检测系统可以运行如下的查询。

查询-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的更多相关文章

  1. ACM解题之(ZOJ 2724)Windows Message Queue

    题目来源: 点击打开链接 题目翻译: 消息队列是windows系统的基本基础.对于每个进程,系统都维护一个消息队列.如果这个过程发生某些事情,例如鼠标点击,文本改变,系统会向队列添加一条消息.同时,如 ...

  2. ACM解题之(ZOJ 1094) Matrix Chain Multiplication

    题目来源: 点击打开链接 题目翻译: 矩阵乘法问题是动态规划的典型例子. 假设你必须评估一个表达式,如A * B * C * D * E,其中A,B,C,D和E是矩阵.由于矩阵乘法是关联的,乘法运算的 ...

  3. ACM解题之在线翻译 Give Me the Number

    Give Me the Number Time Limit: 2 Seconds                                     Memory Limit: 65536 KB  ...

  4. 山东省第四届acm解题报告(部分)

    Rescue The PrincessCrawling in process... Crawling failed   Description Several days ago, a beast ca ...

  5. ACM解题之快速输出杨辉三角形(前68行)

    题意: 本题要求计算并输出杨辉三角形的前 68 行. Time Limit:1000MS Memory Limit:65536K 解题: 为了能在规定时间准确输出杨辉三角形的前68行,这里我用了精准的 ...

  6. ACM解题之素矩阵

    题意: 如果一个矩形的两条边都是素数,则称此矩形为素矩形.本题给出一个素矩形的面积,请计算其两条边的值.有多个测试用例.每个用例占一行,包含一个表示素矩形面积且不超过 108 的正整数.输入直至没有数 ...

  7. ACM解题之回文序列

    题意: 一个长度为 n 的序列 a1, m2, ..., an-1, an,如果 ai = an-i+1, i = 1, 2, ..., n,则称之为"回文序列".本题对于给定的一 ...

  8. ACM学习历程—ZOJ 3868 GCD Expectation(莫比乌斯 || 容斥原理)

    Description Edward has a set of n integers {a1, a2,...,an}. He randomly picks a nonempty subset {x1, ...

  9. ACM学习历程—ZOJ 3777 Problem Arrangement(递推 && 状压)

    Description The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem sett ...

随机推荐

  1. Atitit.eclipse comment  template注释模板

    Atitit.eclipse comment  template注释模板 1. Code templet1 1.1. Settpath1 1.2. 设置存储1 1.3. 导出设置1 2. Java d ...

  2. atitit.MIZIAN 陕北方言 特有词汇 大词典 attilax 整理 a--g v1 q31.xlsx

    atitit.MIZIAN 陕北方言 特有词汇 大词典 attilax 整理 a--g v1 q31.xlsx 1  Mizian陕北方言 english英语 spain西班牙语 cantonese粤 ...

  3. Xamarin for VS 3.11.1594 Stable版免费完整破解补丁

    Xamarin for VS 3.11.1594 Stable版免费完整破解补丁 此版本只能用于3.11.1594版本破解, 其他版本可能会有错误. Android和IOS完整支持,不像某些破解只支持 ...

  4. Spring Boot全日志设置

    说在前面 这里日志分两种.一种是tomcat的输出(系统)日志,一种是自己定义的日志. 系统日志设置 目标 当springboot接收到请求时记录日志到文件中 实现 你只需要在你的绿叶applicat ...

  5. Java序列化的几种方式

    本文着重解说一下Java序列化的相关内容. 假设对Java序列化感兴趣的同学能够研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从 ...

  6. D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

    D. Powerful array time limit per test seconds memory limit per test megabytes input standard input o ...

  7. 我的 Android 开发实战经验总结

    我的 Android 开发实战经验总结 字数4440 阅读5137 评论43 喜欢250 曾经一直想写一篇总结 Android 开发经验的文章,预计当时的我还达不到某种水平,所以思路跟不上,下笔又捉襟 ...

  8. Ultra-QuickSort - poj 2299 (归并排序+统计逆序数)

    利用归并排序统计逆序数,利用归并求逆序在对子序列s1和s2在归并时(s1,s2已经排好序),若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s ...

  9. How tomcat works学习笔记

    最近在看Tomcat的源码, 所以找了一本相关的书籍<How tomcat works>. 博客内容多为 学习该书时所记录的笔记.(如有侵权行为,请联系我:eviltomorrow@163 ...

  10. python dict转json并保存文件

    import json f = open("index.html", "wb") json.dump(response.data, f) f.close() d ...