【蓝桥杯】日记统计

锦通  金牌会员 | 2025-3-23 18:54:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

日记统计(编程题)https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53
https://dashoj.com/d/lqbproblem/p/53
题目

日记统计(编程题)

讲解

这个讲解感觉比力通俗易懂。
蓝桥杯2018年省赛B组08(c/c++)日记统计_哔哩哔哩_bilibili积极学习, 视频播放量 1641、弹幕量 0、点赞数 24、投硬币枚数 8、收藏人数 15、转发人数 3, 视频作者 昨晚梦到有鸽子落在你肩上, 作者简介 考研小朋友,相干视频:乘积最大 --蓝桥杯2018年c/c++B组10,分数 蓝桥杯2018年省赛c/c++A01,蓝桥杯2018 星期一,红客联盟真有那么神?83小时深搜保卫战揭秘,【蓝桥杯】学会暴力拿下省一!,2024.1.19第十四届蓝桥杯EDA省赛真题(作业评讲3),蓝桥杯基础算法:一维差分,蓝桥杯~三升序列,美国要把TP-LINK禁了,这事实在不知该从那里吐槽,2025年了,我们应该怎样看待C++语言?https://www.bilibili.com/video/BV19i4y1377m?vd_source=f93e63f88343133e9467ba52a1737210https://www.bilibili.com/video/BV19i4y1377m?vd_source=f93e63f88343133e9467ba52a1737210
https://www.bilibili.com/video/BV19i4y1377m?vd_source=f93e63f88343133e9467ba52a1737210
题目描述

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

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

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

输入数据 1

  1. 7 10 2  
  2. 0 1  
  3. 0 10   
  4. 10 10  
  5. 10 1  
  6. 9 1
  7. 100 3  
  8. 100 3
复制代码
输出数据 1

  1. 1  
  2. 3
复制代码
提示



  • 对于 50% 的数据,1≤K≤N≤1000。
  • 对于 100% 的数据,1≤K≤N≤
    ,0≤id,ts≤

思路

双指针,滑动窗口,给id分组(按照时间从小到大的次序)
利用pair数组分组,id虽然后输入,但要放在first,如许以id为优先排序
比如样例的
  1. 0 1  
  2. 0 10   
  3. 10 10  
  4. 10 1  
  5. 9 1
  6. 100 3  
  7. 100 3
复制代码
按照id为first进行排序后
  1. id  ts
  2. 1   0
  3. 1   9
  4. 1   10
  5. 3   100
  6. 3   100
  7. 10  0
  8. 10  10
复制代码
通过循环得到每个id的begin和end,然后用自界说的judge函数进行判定这个id是否是热帖。
judge函数:核心是双指针


  • 双指针窗口初始化

    • 快指针i与慢指针j初始指向当前id的起始位置begin
    • sum记载窗口内有用点赞数,初始为0

  • 窗口滑动逻辑

    • 窗口扩张:快指针i右移,sum++累计点赞数
    • 阈值检测:当sum >= k时,查抄窗口时间跨度p.y - p[j].y:

      • 若时间差< d:满意热帖条件,直接返回true
      • 否则:慢指针j右移缩小窗口,sum--保持窗口大小

    • 停止条件:快指针i超出当前id的end位置

  • 关键性质

    • 通过单调滑动窗口确保时间复杂度为O(n)
    • 依赖时间有序性(因预处理排序保证)

代码

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=1e5+5;
  6. pair<int,int>p[N];
  7. bool judge(int begin, int end);
  8. #define x first
  9. #define y second
  10. int n,d,k;
  11. int main() {
  12.     cin>>n>>d>>k;
  13.     for(int i=0;i<n;i++)
  14.     {
  15.         cin>>p[i].y>>p[i].x;//让后输入的id放到pair数组的first位置,这样排序时以id优先
  16.     }
  17.     sort(p,p+n);
  18.     int i=0;
  19.     while(i<n)
  20.     {
  21.         int id=p[i].x;
  22.         int begin=i,end;
  23.         while(id==p[i].x&&i<n)//找到每组id的起始位置和终止位置
  24.         {
  25.             end=i;i++;
  26.         }
  27.         if(judge(begin,end))//对这个id进行判断是否为热帖
  28.         {
  29.             cout<<p[end].x<<endl;
  30.         }
  31.     }
  32.     return 0;
  33. }
  34. bool judge(int begin, int end) {
  35.     int i=begin,j=begin;
  36.     int sum=0;
  37.     while(j<=i&&i<=end)//使用双指针
  38.     {
  39.         sum++;
  40.         if(sum>=k)
  41.         {
  42.             if(p[i].y-p[j].y<d)return true;
  43.             else{
  44.                 sum--;j++;
  45.             }
  46.         }
  47.         i++;
  48.     }
  49.     return false;
  50. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表