当前位置: 首页 > news >正文

csp信奥赛C++高频考点专项训练:【滑动窗口】案例2:不同值计数问题

csp信奥赛C++高频考点专项训练:【滑动窗口】案例2:不同值计数问题

题目描述

给定一个长度为n的正整数数组和一个固定长度为k的滑动窗口,窗口从数组的最左端移动到最右端。每次窗口向右滑动一个位置,你需要计算并输出每个窗口位置中不同整数的个数。

输入描述
  • 第一行:两个整数nk(1 ≤ k ≤ n ≤10 6 10^6106
  • 第二行:n个整数,表示数组元素(每个正整数均不超过 1000)
输出描述
  • 一行整数:包含n - k + 1个值,每个值对应窗口滑动过程中窗口内不同整数的个数(用空格分隔)
样例输入
8 3 1 2 1 3 2 1 2 3
样例输出
2 3 3 3 2 3

思路分析

用固定大小的滑动窗口统计不同整数的个数。由于数组元素值不超过 1000,可以用一个计数数组cnt记录当前窗口内每个值出现的次数,并用一个变量diff维护窗口中不同值的个数。

  • 初始化:先统计前k个元素,每遇到一个新值(cnt[val] == 0)则diff++,然后cnt[val]++
  • 滑动:窗口每向右移动一位,左侧元素离开窗口,右侧新元素进入窗口。
    • 移除左侧元素:cnt[out]--,若减为 0 则diff--
    • 加入右侧元素:若cnt[in] == 0diff++,然后cnt[in]++
  • 每个窗口的答案就是当前的diff,依次输出。

时间复杂度O(n),空间复杂度O(1000),完全满足n ≤ 1e6的要求。


代码实现

#include<bits/stdc++.h>usingnamespacestd;intn,k,a[1000010];intcnt[1001];//计数数组,值≤1000intmain(){cin>>n>>k;for(inti=1;i<=n;i++)cin>>a[i];intdiff=0;//当前窗口不同整数的个数for(inti=1;i<=k;i++){//初始化第一个窗口if(cnt[a[i]]==0)diff++;//新值出现,种类数+1cnt[a[i]]++;}cout<<diff<<" ";//输出第一个窗口答案for(inti=k+1;i<=n;i++){//滑动窗口,i为右端点intout=a[i-k];//即将离开窗口的左端元素cnt[out]--;if(cnt[out]==0)diff--;//该值不再出现,种类数-1intin=a[i];//即将进入窗口的右端元素if(cnt[in]==0)diff++;//新值出现,种类数+1cnt[in]++;cout<<diff<<" ";//输出当前窗口答案}return0;}

功能分析

  • 输入处理:读取nk和数组,数组元素限制在 1000 内,因此计数数组大小固定为 1001。
  • 窗口滑动逻辑:每次移动只更新两端元素,避免重复统计,保证每个元素最多进出窗口一次。
  • 答案输出:按窗口从左到右的顺序输出每个窗口内不同整数的个数,空格分隔。

完整信奥赛C++普及组CSP-J一等奖通关刷题题单及题解,请关注专栏:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转


【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}

http://www.jsqmd.com/news/1237176/

相关文章:

  • 5步掌握wiliwili:在任天堂Switch上打造专属B站观影站
  • 上海新型材料服务GEO城市合伙人选型推荐哪家靠谱:源头厂商、收益模式与合伙人权益一次看清 - 科技快讯
  • VSCode御用代码编辑器 Monaco Editor 0.56.0 发布,多项依赖版本升级!
  • 2026 南京鼓楼防水补漏公司排名推荐 卫生间屋顶地下室根治指南 - 苏易房屋修缮
  • threepp模型加载器:支持glTF、OBJ、USD等10+格式的完整指南
  • 2026年北京重点任务:科技创新与民生改善解析
  • AI时代领导力重构:从经验决策到人机协同
  • 上海本地连锁GEO城市合伙人选型推荐哪家靠谱:2026年代理决策必须看清的7个核心维度 - 子柔传媒
  • 2026年7月亲身到店探访长春亨得利官方名表服务中心|网点地址和官方电话 - 亨得利官方博客
  • 2026年7月最新万国合肥蜀山万象汇维修保养服务电话 - 万国中国官方服务中心
  • TMS320F2807x USB端点寄存器深度解析与DMA传输实战
  • 5个革命性特性:Ruflo如何重塑AI代理协作与大型项目管理
  • 深入解析EDMA3TC寄存器:从DMA原理到嵌入式系统高效数据搬运实践
  • GameHackingCode状态机设计:构建智能游戏机器人的关键步骤
  • 抖店无货源一件代发怎么弄?抖掌柜电子面单标准化操作流程 - 抖掌柜
  • 多模态架构突破:Buzz如何实现离线语音转录与翻译的跨平台技术革命
  • Concaveman性能优化:为什么这个JavaScript库比传统算法快10倍
  • GitHub Copilot SDK每会话认证:细粒度权限控制的实现
  • 亲身到店探访上海欧米茄官方售后服务中心|完整维修地址与售后热线(2026年7月最新) - 欧米茄服务中心
  • 2026年7月亲身到店体验绍兴亨得利官方名表服务中心|官方地址与售后电话 - 亨得利官方博客
  • 计算机毕业设计之基于springboot的向阳社区志愿者服务系统
  • .NET MAUI升级指南:废弃API替换与架构迁移
  • UE5集成LoRA模型实战:打造智能NPC与动态叙事系统
  • 海外创业者如何成功拓展中国市场:策略与案例分析
  • Django-telegram-bot 后台任务处理:Celery + Redis 异步任务最佳实践
  • 孩子拖拉懒散怎么办?黄龙文武学校准军事化管理改习惯 - 圣龙武术朱老师
  • 格拉苏蒂官网权威发布:常州售后服务网点地址及客户热线2026年7月最新 - 亨得利官方服务中心
  • 5分钟快速上手 Jupynium.nvim:Neovim 与 Jupyter Notebook 无缝集成教程
  • Python与汇川PLC通信:数据采集与可视化实战
  • 2026年7月最新美度合肥万象城维修保养服务电话 - 亨得利钟表维修中心