试题8 日志统计

题目内容

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:

ts id

表示在ts时刻编号id的帖子收到一个"赞"。

现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。

具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。

给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

输入格式

第一行包含三个整数N、D和K。
以下N行每行一条日志,包含两个整数ts和id。

对于50%的数据,1 <= K <= N <= 1000
对于100%的数据,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000

输出格式

按从小到大的顺序输出热帖id。每个id一行。

输入样例

7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出样例

1
3

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include < xxx >
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。

解题思路:

先看懂题目的意思,题目的意思就是,小明写帖子,当帖子在某个时间 [T, T+D] 区间内,获取到的点赞数不小于 K,那么这就是一个热帖。

输入三个数,N,D,K,分别表示点赞记录条数时间周期热帖点赞数

输入格式是:ts id。表示时刻、帖子编号。

最后按从小到大的顺序输出热帖的编号。

那么接下来就是如何处理这个问题了。

首先需要有一个思路,找到一个处理方式。

我开始的时候想到的是,将点赞记录按时刻从小到大排序,然后遍历每个可能的起始点时刻,扫描周期长度过去,统计被点赞的日志。但这样就会有一个问题,时间复杂度太大。

本人,确实还写了这样的代码,过于愚蠢的代码,大家看看就好了。

错误代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <iterator>
using namespace std;struct Time {int ts;//时刻 int id;//被点赞的帖子id
};struct Post {int id;//帖子id int sum;//帖子点赞次数 bool operator < (const Post &a) const {return id < a.id;}
};bool cmp(struct Time a, struct Time b) {return a.ts < b.ts;
}int main(int argc, char** argv) {int N,D,K;set<Post> s1,s2; // s1 辅助存储统计帖子点赞,s2 最终结果set<Post>::iterator it1,it2;vector<Time> v; // 日志记录cin>>N>>D>>K;for(int i=0;i<N;i++) {Time t;cin>>t.ts>>t.id;v.push_back(t);}sort(v.begin(), v.end(), cmp); // 按时间从小到大排序日志记录for(int i=0;i<N;i++) { // 循环日志记录int j = i;if(i!=0 && v[i-1].ts == v[i].ts) // 同一个时刻,不用判断(这里貌似有问题)continue;while(j < N && v[j].ts < v[i].ts+D) {Post p;p.id = v[j].id;p.sum = 1;it1 = s1.find(p);if(it1 != s1.end()) {p.sum += it1->sum;s1.erase(it1);}s1.insert(p);j++;}while(!s1.empty()) {it1 = s1.begin();if(it1->sum >= K) {s2.insert(*it1);}s1.erase(it1);}}while(!s2.empty()) {it2 = s2.begin();cout<<it2->id<<endl;s2.erase(it2); }return 0;
}

接下来才是正题,换一个思路,我们按帖子归类点赞的时间,然后判断在周期内的点赞次数,是否不小于K,就可以得出是否是热帖。

正确代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <iterator>
using namespace std;vector<int> v[100005];int main(int argc, char** argv) {int N,D,K;set<int> s; // 对帖子 ID 进行去重+排序cin>>N>>D>>K;for(int i=0;i<N;i++) {int ts,id;cin>>ts>>id;v[id].push_back(ts); // v[id][] 表示:id编号博客的点赞时间s.insert(id);}for(set<int>::iterator it=s.begin();it!=s.end();it++) { // 遍历每个被点赞的博客sort(v[*it].begin(), v[*it].end()); // 按时间从小到大排序int begin;int sum;for(vector<int>::iterator jt=v[*it].begin();jt!=v[*it].end();jt++) { // 遍历时间if(jt == v[*it].begin()) { // 记录开始时刻begin = *jt;sum = 0;}if(begin+D > *jt) { // 周期内点赞有效,计数++sum++;}else { // 重新开始时刻begin = *jt;}if(sum >= K) { // 输出热帖编号cout<<*it<<endl;break;}}}return 0;
}

蓝桥杯第09届 2018年省赛C/C++大学生B组——试题8 日志统计相关推荐

  1. 第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-职业院校组题解

    第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-职业院校组题解 友情链接 第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-大学组 第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-职业院校组 第十 ...

  2. 第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-职业院校组-知识点题解

    这个题解是参考了"海底烧烤店ai"一位非常优秀的全栈领域创作者的博主写的,自己在看的时候发现个人知识点比较欠缺,所以就在题解下面添加了一些知识点,便于理解. 原博主的文章链接如下: ...

  3. 第十一届蓝桥杯大赛(2020年)软件类省赛第二场 Python大学组 真题+个人解答

    试题A:门牌制作 本题总分:5分 [问题描述] 小蓝要为一条街的住户制作门牌号. 这条街一共有2020位住户,门牌号从1到2020编号. 小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将 ...

  4. 【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-职业院校组 | 精品题解

  5. 【蓝桥杯第六届省赛题-简易温度采集与控制装置】

    蓝桥杯第六届省赛题-简易温度采集与控制装置 #include "reg52.h" #include "onewire.h" #include "int ...

  6. 蓝桥杯第六届决赛真题大全解(java版本)

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 >蓝桥杯第六届决赛第一题[(详情(分机号))](http://blog.csdn.net ...

  7. 蓝桥杯第七届决赛真题大全题解(java版本)

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 >蓝桥杯第七届决赛第一题[(详情(愤怒小鸟))](http://blog.csdn.ne ...

  8. 蓝桥杯第十届真题B组(2019年)

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组# 试题 A:组队# 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每 ...

  9. 蓝桥杯第十三届大赛web大学组题目及答案解析

    - 题目列表 1. 水果拼盘(flex布局 - 送分题) 2. 展开你的扇子 (CSS动画 - 简单题) 直接上代码 /*TODO:请补充 CSS 代码*/ #box:hover div:nth-ch ...

最新文章

  1. MyEclipse2017在线安装SVN
  2. centos6.8_64部署django项目
  3. 《深入理解Java虚拟机》笔记4——类文件结构
  4. linux内核二当家,Linux PWN从入门到熟练(二)
  5. deb和rpm文件安装
  6. hdu2222(看一些单词哪些在模式串中出现过)
  7. C++ 高级篇(三)—— 出错处理
  8. 烂泥:ubuntu中使用virt-manager图形化新建虚拟机
  9. poj 1185(状态压缩DP)
  10. 【django】 model_to_dict ‘QuerySet‘ object has no attribute ‘_meta‘
  11. S19王者荣耀服务器维护,王者荣耀:S19新赛季更新,她没上线惨遭重做,英雄调整,界面优化...
  12. TO-220与TO-220F的区别 封装
  13. 系统学习语义分割文章推荐以及顺序
  14. java中 Object转换成 int 类型。
  15. js中apply、bind、call的用法和区别
  16. windows之批处理读取注册表,得到我的文档默认路径
  17. 金蝶K3案例实验实际成本后台配置
  18. Flex弹性盒子(一篇带你掌握潮流 Flex 布局)
  19. Butterfly主题背景魔改
  20. ipv4和ipv6与int互转通用处理方式

热门文章

  1. Calcite优化规则之ProjectAggregateMergeRule
  2. [ML-03] Matplotlib-3
  3. Docker 图片水印中文乱码显示为方框, 设置Docker容器字体
  4. 02.图像分类任务介绍线性分类器(上).1080P
  5. 35_mac小目标5_神器Alfred的作用,安装,破解,使用
  6. 2、Canal的deployer模块
  7. AP计算机从绝望到满分-----深圳中学张嘉轩如何说
  8. 家用洗地机有什么优缺点?入门级家用洗地机
  9. 关于时区、时间、时刻
  10. php基础-GD库-批量制作水印图片