【蓝桥杯基础题】2018年省赛—日志统计

news2024/9/29 13:21:59

在这里插入图片描述

  • 👑专栏内容:蓝桥杯刷题
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、题目描述
    • 1.问题描述
    • 2.输入格式
    • 3.输出格式
    • 4.一个例子
  • 二、题目分析
    • 1、暴力法
    • 2、双指针
  • 三、代码汇总
    • 1、暴力代码汇总
    • 2、双指针代码汇总


一、题目描述

1.问题描述

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:
ts id,表示在ts时刻编号id的帖子收到一个"赞"。现在小明想统计有哪些帖子曾经是"热帖”。
如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。
具体来说,如果存在某个时刻T满足该帖在 [ T , T 十 D ) [T,T十D) [T,TD)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

2.输入格式

输入格式:
第一行包含三个整数 N,D,K。
以下 N 行,每行一条日志,包含两个整数 ts 和 id。其中 1 ≤ K ≤ N ≤ 1 0 5 1≤K≤N≤10^5 1KN105 , 0 ≤ t s ≤ 1 0 5 , 0 ≤ i d ≤ 1 0 5 0≤ts≤10^5,0≤id≤10^5 0ts105,0id105

3.输出格式

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

4.一个例子

下面是一个样例
输入:
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出:

1
3

二、题目分析

先简单的说一下这道题的意思,就是在输入的数据中找出每个 [ 当前时间点,当前时间点+D) 这个时间的范围内,id出现的次数是不是大于等于K,如果在这些范围内大于等于K,最后就输出该id。
看一下给出的样例,7代表7行日志,10代表当前时间点+10这个范围,2表示出现id次数要大于2.

在[0,0+10) 这个范围内,输入的数据中出现了2次1,等于2,所以要输出它。
在[1,1+10)这个范围内,输入的数据中只出现了1次10,不符合。
在[91,91+10) 这个范围内,输入的数据中出现了2次3,等于2,所以2要输出它。

1、暴力法

看到这道题的第一个感觉就是,直接枚举出所有时间点的情况,然后再去判断是不是符合大于等于K的条件,如果符合条件,就标记它,最后一起输出。那这样就需要两层循环,第一层循环的范围是从0开始一直到输入数据中的最大时间,第二层循环就是判断每次的时间段中每个id出现的次数是不是大于等于K。(总代码放在最后)

 for (int time = 0; time <= Max_time; time++) //枚举时间
    {
        memset(cnt, 0, sizeof(cnt));		 //每次的时间段都要重新计数
        for (int i = 1; i <= n; i++)	//枚举日志
        {
            int t = blog[i].ts;
            int id = blog[i].id;
            if (t >= time && t < time + d) //判断是不是符合时间范围
                cnt[id]++;
            if (cnt[id] >= k)		//判断是不是符合大于等于K
                hot[id] = true;    //标记答案
        }
    }

但是这样干虽然简单,但是时间复杂度有点高,不能完成所有的样例。

在这里插入图片描述

2、双指针

对双指针完全不了解的朋友可以看下这篇文章:双指针(尺取法):爱,是双向奔赴,还是你追我赶?
双指针中快慢指针题目的特点就是:每次循环都会看窗口(两个指针围起来的区间)是不是满足某个条件,如果满足,输出的是子区间的变形。
这道题中的范围 [ T , T 十 D ) [T,T十D) [T,TD)就是一个可以滑动的窗口,我们可以使用双指针中的快慢指针,再将输入的数据按照时间的排序后,不断地移动窗口,这样当处理到T时候, [ T , T 十 D ) [T,T十D) [T,TD)这个窗口前面的数据就会被忽略。
以本题的输入的样例为例。我们先对该组数据按照时间进行排序:
在这里插入图片描述
然后定义两个指针,分别为指针i指针j
指针i作为快指针,遍历随时间而消失的帖子。指针j作为慢指针,根据题目的要求(指针i对于的时间-指针j对应的时间小于等于D),舍去T之前的帖子(指针j移动)。
在这里插入图片描述

    int i = 0; int j = 0;  //定义两个指针
    for (i = 0; i < n; i++) //快指针遍历
    {
        num[blog[i].id]++; //遍历过的每个帖子点赞数+1
        while (blog[i].ts - blog[j].ts >= d) //超出题目时间范围
        {
            num[blog[j].id]--;  //j指针指向的帖子点赞数-1
            j++;			//指针j向前移动
        }
    }

指针j每移动一步时候,就把其对应的帖子点赞数量减去1,这样就能保证两个指针包围的窗口不会超过题目范围以外的数据。
在这里插入图片描述
在这里插入图片描述
写完之后去测一下 (总代码放在最后)
在这里插入图片描述

在这里插入图片描述

三、代码汇总

1、暴力代码汇总

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
bool hot[N]; //判断是不是热帖
int cnt[N]; //记录点赞数
int n, d, k;
struct Blog
{
    int ts;
    int id;
}blog[N];
int main() {
    scanf("%d%d%d", &n, &d, &k);
    int Max_time = 0; 
    for (int i = 1; i <= n; i++)
    {
        scanf("%d%d", &blog[i].ts, &blog[i].id);
        Max_time = max(blog[i].ts, Max_time); //获取输入的数据中的最大时间
    }

    for (int time = 0; time <= Max_time; time++) //枚举时间
    {
        memset(cnt, 0, sizeof(cnt)); //每次的时间段都要重新计数
        for (int i = 1; i <= n; i++) //枚举日志
        {
            int t = blog[i].ts; 
            int id = blog[i].id;
            if (t >= time && t < time + d) //判断是不是在范围之内
                cnt[id]++; 
            if (cnt[id] >= k)  //判断是不是符合热帖要求
                hot[id] = true; //标记为热帖
        }
    }
    for (int i = 0; i <= 1e5; i++)
        if (hot[i]) 
            printf("%d\n", i);
}

2、双指针代码汇总

#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int num[N];	//记录帖子点赞数
bool hot[N]; //判断是不是热帖
int n, d, k; 
struct Blog 
{
    int ts; 
    int id;
}blog[N];

int cmp(Blog a, Blog b)//排序规则是按时间从小到大
{
    return a.ts < b.ts;
}
int main() {
    scanf("%d%d%d", &n, &d, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d", &blog[i].ts, &blog[i].id);
    }
    sort(blog, blog + n,cmp);//排序
    int i = 0; int j = 0;
    for (i = 0; i < n; i++) //指针i开始遍历
    {
        num[blog[i].id]++; //遍历过的每个帖子点赞数+1
        while (blog[i].ts - blog[j].ts >= d)//超出题目时间范围
        {
            num[blog[j].id]--; //指针j指向的帖子点赞数-1
            j++; //指针j向前移动
        }
        if (num[blog[i].id] >= k) //如何符合标准
            hot[blog[i].id] = true; //标记为热帖
    }
    for (int i = 0; i < N; i++)
        if (hot[i] )
            printf("%d\n", i);
    return 0;
}

📢📢📢📢📢📢
💗 你正在阅读 【子夜的星】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql第一期 数据库概述】

文章目录1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库特点2.3SQL优点3.常见的数据库介绍1.Oracle2.SQL Server3.MySQL4.Access5.DB26.PostgreSQL7.SQLite8.informix4. MySQL介绍4.1Mysql重大历史事件4.2 关于MySQL 8.04.3 Why choose MySQL?…

linux内核读文件代码分析

linux下“一切皆文件”,所有设备都可以被抽象成文件,用户态可以通过open、read、write、llseek等api操作一个文件,通过系统调用进入内核态,最终访问到pagecache/磁盘上的数据,然后返回给用户态。 kernel version:v6.2-rc4 社区master主干 用户态应用程序调用read接口,通…

【转载】车载传感器与云端数据交换标准SensorIS的理解与使用

原文 https://zhuanlan.zhihu.com/p/386277784 1、什么是SensorIS?SensorIS全称是Sensor Interface Specification&#xff0c;翻译为中文就是传感器接口规范&#xff0c;是由来自全球汽车行业的主机厂、地图和数据提供商、传感器制造商和电信运营商共同组成的开放团体发布的一…

JavaEE day10 初识SpringMVC

JSON简介 JSON &#xff1a;JavaScript Object Notation JS对象表示法 是轻量级的文本数据交换格式&#xff0c;但是JSON仍然独立于语言和平台。其解析器和库支持许多不同的编程语言。目前非常多的动态编程语言&#xff08;java&#xff0c;PHP&#xff09;都支持JSON。JSON…

禅道好用吗?优缺点及类似10大项目管理系统介绍

类似禅道的十大项目管理软件&#xff1a;1、一站式研发项目管理软件PingCode&#xff1b;2、通用型项目协作工具Worktile&#xff1b;3、开源项目管理软件Redmine&#xff1b;4、免费项目管理软件Trello&#xff1b;5、无代码项目管理软件Monday&#xff1b;6、IT项目追踪管理工…

面试宝典-数据库基础

数据库基础前言一、数据库1.1 sql练习题1.2 sql语句执行顺序1.3 sql语句编写前言 本文主要记录B站视频视频链接的内容&#xff0c;做到知识梳理和总结的作用&#xff0c;项目git地址。 一、数据库 1.1 sql练习题 user表数据: idusername1张三2李四3王五4小刘 user_role表数…

CrackQL:一款功能强大的图形化密码爆破和模糊测试工具

关于CrackQL CrackQL是一款功能强大的图形化密码爆破和模糊测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以针对密码安全和应用程序安全进行渗透测试。 除此之外&#xff0c;CrackQL同时也是一款通用的GraphQL渗透测试工具&#xff0c;它可以控制速率限制…

垃圾分类智能分析系统 yolov7

垃圾分类智能分析系统应用pythonyolov7网络模型深度学习识别技术&#xff0c;自动识别违规投放行为并现场进行语音提示实时预警。如垃圾满溢抓拍预警、人脸识别、工服识别、厨余垃圾混投未破袋识别预警、垃圾落地识别预警、人来扔垃圾语音提醒等。我们选择当下YOLO最新的卷积神…

数组去重的七种方法

数组去重的七种方法1. 双重for循环2. forindexOf3.es6 set4.filter5.includes6.创建一个新的object7.new Map()1. 双重for循环 第1种是定义一个新的空数组&#xff0c;再执行嵌套双循环&#xff0c;监测空数组中如果没有的元素&#xff0c;push进空数组中。这个方法考察了conti…

AcWing - 寒假每日一题2023(DAY 16——DAY 20)

文章目录一、AcWing 4455. 出行计划&#xff08;简单&#xff09;1. 实现思路2. 实现代码二、AcWing 4510. 寻宝&#xff01;大冒险&#xff01;&#xff08;简单&#xff09;1. 实现思路2. 实现代码三、AcWing 3422. 左孩子右兄弟&#xff08;中等&#xff09;1. 实现思路2. 实…

【MySQL】过年没有回老家,在出租屋里整理了一些思维导图

Xmind导图知识点Mysql知识点SQL知识点Mybatis知识点面试题分享MySQL部分Mybatis部分Mysql知识点 通过下面的图片可以看出&#xff0c;MySQL基础语法分为四部分&#xff1a;连接数据库&#xff0c;对数据库的操作&#xff0c;对表中的数据操作&#xff0c;对表操作等等。 SQL…

python exe程序注册为window系统服务

1、使用pyinstaller将py打包成exe 1、安装 pip install pyinstaller2、打包成exe可执行文件 pyinstaller -F packTest.py #packTest.py为待打包的py文件打包成功后会在同级目录中生成两个文件夹和一个文件&#xff0c;分别为dist和build文件夹&#xff0c;以及一份与.py文件同…

Java——最大子数组和

题目链接 leetcode在线oj题——最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 题目示例 输入&#xff1a;…

Vulnhub DC-4靶机渗透

环境准备DC-4靶机 ip&#xff1a;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;kali攻击机 ip&#xff1a;192.168.153.128一、信息收集kali攻击机中&#xff0c;使用 arp-scan -l 扫描c段&#xff08;-l为扫描c段&#xff09;确定靶…

自动驾驶——智能配电

一、汽车配电 汽车配电&#xff08;Power Distrubition Unit&#xff0c;PDU&#xff09;分为低压配电与高压配电&#xff0c;即低压PDU与高压PDU。 二、传统控制方式——PCB式电器盒 传统配电盒&#xff08;机电器件&#xff09;&#xff1a; &#xff08;1&#xff09;继…

为什么要做黑盒测试?黑盒测试有什么作用?

对于软件测试的从业者来说&#xff0c;黑盒测试是十分重要的测试方式&#xff0c;它可以弥补白盒测试检查不到的部分。可能刚刚入门的测试小白&#xff0c;对于为什么要做黑盒测试&#xff1f;黑盒测试有什么作用&#xff1f;仍然抱有很大的疑问。下面小编就来从黑盒测试的概念…

QT入门Buttons之QPushButton

目录 一、界面布局介绍 1、布局器中的位置及使用 2、控件的界面属性 3、常用基本属性介绍 3.1控件名称 3.2控件大小属性 3.3按钮上的文字设置 3.4设置按钮的样式 二、属性功能介绍 1、常用方法介绍 2、基本信号介绍 三、Demo展示 一、界面布局介绍 1、布局器中的位…

丰田埃尔法商务租车价格是多少,它的性能到底有多好呢

丰田埃尔法作为MPV之王。埃尔法的高腰线和深色玻璃也使内部更具神秘感&#xff0c;惹眼闪烁的进气格栅&#xff0c;类似盔甲一般的全镀铬饰条构成的霸道前脸和富于设计感的车身曲线&#xff0c;细节处采用36颗闪亮镀铬装饰点缀&#xff0c;有着很高的辨识性。保持了典型的MPV风…

需要代理上网的linux服务器,无法使用NTP同步时间,只需要这一行指令即可。

这将会是一篇让你对时间同步受益匪浅的文章&#xff01;如果你看完之后有收获&#xff0c;希望你能加个关注&#xff0c;如果你看完之后没有收获&#xff0c;希望你能留下你路过的痕迹。 由于工作需要&#xff0c;我们使用了一款神奇的调度框架&#xff0c;叫powerjob&#xff…

【职工管理系统】C++全栈体系(十四)

职工管理系统 第七章 添加职工 功能描述&#xff1a;批量添加职工&#xff0c;并且保存到文件中 一、功能分析 分析&#xff1a; 用户在批量创建时&#xff0c;可能会创建不同种类的职工 如果想将所有不同种类的员工都放入到一个数组中&#xff0c;可以将所有员工的指针维…