2025年12月GESP真题及题解(C++八级): 宝石项链

2025年12月GESP真题及题解(C++八级): 宝石项链

题目描述

小 A 有一串包含n nn枚宝石的宝石项链,这些宝石按照在项链中的顺序依次以1 , 2 , … , n 1,2,\ldots,n1,2,,n编号,第n nn枚宝石与第1 11枚宝石相邻。项链由m mm种宝石组成,其中第i ii枚宝石种类为t i t_iti

小 A 想将宝石项链分给他的好朋友们。具体而言,小 A 会将项链划分为若干连续段,并且需要保证每段都包含全部m mm种宝石。请帮小 A 计算在满足条件的前提下,宝石项链最多可以划分为多少段。

输入格式

第一行,两个正整数n , m n,mn,m,分别表示宝石项链中的宝石的数量与种类数。

第二行,n nn个正整数t 1 , t 2 , … , t n t_1,t_2,\ldots,t_nt1,t2,,tn,表示每枚宝石的种类。

输出格式

输出一行,一个整数,表示宝石项链最多可以划分的段数。

输入输出样例 1
输入 1
6 2 1 2 1 2 1 2
输出 1
3
输入输出样例 2
输入 2
7 3 3 1 3 1 2 1 2
输出 2
2
说明/提示

对于40 % 40\%40%的测试点,保证2 ≤ n ≤ 1000 2\le n\le 10002n1000

对于所有测试点,保证2 ≤ n ≤ 10 5 2\le n\le 10^52n1052 ≤ m ≤ n 2\le m\le n2mn1 ≤ t i ≤ m 1\le t_i\le m1tim,保证1 , 2 , … , m 1,2,\ldots,m1,2,,m均在t 1 , t 2 , … , t n t_1,t_2,\ldots,t_nt1,t2,,tn中出现。

思路分析

这是一个环形数组划分问题。我们需要将一个环形宝石项链(第n个宝石与第1个宝石相邻)划分为若干连续段,每段必须包含全部m种宝石,求最多能划分多少段。

核心难点
  1. 环形结构:数组是环形的,需要考虑循环的情况
  2. 最短包含所有宝石的段:要划分尽可能多的段,每段应该是包含所有m种宝石的最短连续段
  3. 贪心策略:每次找到最短的合法段,然后从下一位置继续寻找
算法思路
  1. 环形处理:将原数组复制一份接在后面,形成2n长度的数组,这样环形问题转化为线性问题
  2. 滑动窗口:使用双指针维护一个包含所有m种宝石的最短窗口
  3. 贪心划分
    • 从起点开始,找到最短的包含所有宝石的段
    • 记录这个段的结束位置,然后从下一个位置继续寻找
    • 重复直到覆盖整个环形数组
  4. 最大化段数:由于是环形,不同起点可能导致不同结果,需要尝试所有起点
时间复杂度优化
  • 朴素方法:对于每个起点O(n)寻找,总O(n²),会超时
  • 优化方法:使用**倍增法(Binary Lifting)**预处理每个位置开始跳转的信息
    • 预处理:对于每个位置i,计算从i开始取一段后下一个起点的位置
    • 倍增表:f[i][k]表示从i开始取2^k段后到达的位置
    • 查询:对于每个起点,用倍增快速计算最多能取多少段
具体步骤
  1. 数据准备:复制数组为2n长度
  2. 滑动窗口预处理
    • 对于每个位置i,找到以i为起点的最短合法段的结束位置
    • 记录next[i] = 结束位置 + 1(下一段的起点)
  3. 构建倍增表
    • f[i][0] = next[i](跳1段)
    • f[i][k] = f[f[i][k-1]][k-1](跳2^k段)
  4. 枚举起点计算
    • 对每个起点i,用倍增法计算最多能跳多少段
    • 保持结束位置不超过i+n(环形限制)
  5. 取最大值:所有起点结果的最大值

代码实现

#include<bits/stdc++.h>usingnamespacestd;constintMAXN=2e5+5;// 2倍长度constintLOG=20;// 2^20 > 1e6intn,m;intt[MAXN];// 宝石数组(已复制为2倍长度)intcnt[MAXN];// 计数数组,记录当前窗口每种宝石数量intnxt[MAXN];// nxt[i]: 从i开始取一段后下一个起点位置intf[MAXN][LOG];// 倍增表:f[i][k]表示从i开始取2^k段后到达的位置intmain(){// 读入数据cin>>n>>m;for(inti=0;i<n;i++){cin>>t[i];t[i+n]=t[i];// 复制一份,处理环形}// 滑动窗口预处理每个位置的下一个起点inttypes=0;// 当前窗口内宝石种类数intr=0;// 右指针// 初始化计数数组for(inti=1;i<=m;i++)cnt[i]=0;// 遍历每个位置作为左端点for(intl=0;l<2*n;l++){// 扩展右指针,直到窗口包含所有m种宝石while(r<2*n&&types<m){cnt[t[r]]++;if(cnt[t[r]]==1)types++;r++;}// 如果找到了包含所有宝石的窗口,记录下一个起点if(types==m){nxt[l]=r;// 结束位置+1就是下一段起点}else{nxt[l]=2*n;// 标记为无效位置}// 移动左指针前,减少计数cnt[t[l]]--;if(cnt[t[l]]==0)types--;}// 构建倍增表// 初始化:跳2^0=1段for(inti=0;i<2*n;i++){f[i][0]=nxt[i];}// 计算2^k段for(intk=1;k<LOG;k++){for(inti=0;i<2*n;i++){if(f[i][k-1]<2*n){f[i][k]=f[f[i][k-1]][k-1];}else{f[i][k]=2*n;// 超出范围}}}// 枚举每个起点,计算最多段数intans=0;for(intstart=0;start<n;start++){intpos=start;// 当前位置intseg=0;// 段数// 从大到小尝试跳转for(intk=LOG-1;k>=0;k--){if(f[pos][k]<=start+n){// 跳2^k段后不超过环形范围seg+=(1<<k);// 增加段数pos=f[pos][k];// 更新位置}}ans=max(ans,seg);}cout<<ans<<endl;return0;}

功能分析

1. 数据预处理部分
// 复制数组处理环形for(inti=0;i<n;i++){t[i+n]=t[i];}
  • 目的:将环形问题转化为线性问题
  • 原理:在长度为2n的数组上,任何长度为n的窗口都对应原环形数组的一个起始位置
2. 滑动窗口预处理
while(r<2*n&&types<m){cnt[t[r]]++;if(cnt[t[r]]==1)types++;r++;}
  • 功能:对于每个左端点l,找到最短的包含所有m种宝石的右端点
  • 变量说明
    • types:当前窗口内不同宝石的种类数
    • cnt[]:记录每种宝石的出现次数
    • nxt[l]:从l开始取一段后,下一段的起始位置
3. 倍增表构建
for(intk=1;k<LOG;k++){for(inti=0;i<2*n;i++){if(f[i][k-1]<2*n){f[i][k]=f[f[i][k-1]][k-1];}}}
  • 原理f[i][k] = f[f[i][k-1]][k-1]表示从i跳2k段等价于先跳2(k-1)段,再跳2^(k-1)段
  • LOG选择:2^20 ≈ 1e6 > 2×1e5,足够覆盖所有可能跳转
4. 枚举起点计算
for(intk=LOG-1;k>=0;k--){if(f[pos][k]<=start+n){seg+=(1<<k);pos=f[pos][k];}}
  • 贪心策略:从高位向低位尝试跳转
  • 约束条件f[pos][k] <= start + n确保跳转后不超过环形范围
  • 时间复杂度:每个起点O(log n),总O(n log n)
5. 算法复杂度
  • 时间复杂度:O(n log n)
    • 滑动窗口预处理:O(n)(每个元素进出各一次)
    • 倍增表构建:O(n log n)
    • 枚举起点计算:O(n log n)
  • 空间复杂度:O(n log n)(主要存储倍增表)
6. 关键点总结
  1. 环形处理技巧:数组复制是处理环形问题的常用方法
  2. 滑动窗口优化:双指针法在线性时间内找到所有最短合法段
  3. 倍增法应用:将多次跳转压缩为对数级别查询
  4. 贪心正确性:每次取最短段能最大化段数,这是本题的关键性质
7. 示例解析

以样例1为例:

n=6, m=2 宝石序列: 1 2 1 2 1 2
  • 最短合法段长度均为2(包含1和2)
  • 可以划分为3段:[1,2]、[1,2]、[1,2]
  • 代码会找到所有起点中的最优解

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、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

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

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

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

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

· 文末祝福 ·

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

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

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

相关文章

2026年GEO服务商评测:高客单价行业如何靠AI破局?深度对比三类玩家,揭秘原圈科技领跑之道

原圈科技在GEO(生成式引擎优化)领域被普遍视为领航者。其优势并非单一模型,而是自主的"大模型编排底座"与协同工作的"营销智能体矩阵"。基于此AI原生架构,原圈科技在高客单价、长决策链行业(如金融、汽车)表现突出,为企业提供从洞察到转化的端到端AI驱动增…

AI隐私保护在人力资源的应用:员工照片处理方案

AI隐私保护在人力资源的应用&#xff1a;员工照片处理方案 1. 引言&#xff1a;AI人脸隐私卫士的诞生背景 随着人工智能技术在企业数字化转型中的广泛应用&#xff0c;人力资源管理正逐步迈向智能化与自动化。从员工入职档案电子化到内部培训视频分析&#xff0c;大量包含人脸…

Misra C++与CI/CD流水线集成:自动化检测方案设计

将 Misra C 静态分析深度融入 CI/CD&#xff1a;打造高可靠代码的自动化防线在汽车电子、工业控制和医疗设备等安全关键领域&#xff0c;一个指针越界、一次资源泄漏&#xff0c;都可能引发灾难性后果。面对日益复杂的C代码库&#xff0c;如何系统性地规避语言陷阱&#xff1f;…

实时系统中ISR编写的最佳实践与避坑指南

中断服务程序&#xff08;ISR&#xff09;的正确打开方式&#xff1a;实时系统中的高效设计与实战避坑 在嵌入式世界里&#xff0c; 中断服务程序 &#xff08;Interrupt Service Routine, ISR &#xff09;就像是一位“急诊医生”——它不参与日常调度&#xff0c;却必须在…

绿色安全框提示功能解析:AI人脸卫士WebUI使用指南

绿色安全框提示功能解析&#xff1a;AI人脸卫士WebUI使用指南 1. 技术背景与核心价值 在数字化时代&#xff0c;图像和视频的传播变得前所未有的便捷。然而&#xff0c;随之而来的人脸隐私泄露风险也日益加剧——无论是社交媒体上的合照分享&#xff0c;还是监控影像的公开发…

手把手教你用Qwen2.5-0.5B-Instruct搭建智能编程助手

手把手教你用Qwen2.5-0.5B-Instruct搭建智能编程助手 在当前AI驱动的开发浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;正逐步成为程序员的“第二大脑”。阿里云推出的 Qwen2.5-0.5B-Instruct 是一款轻量级但功能强大的指令调优语言模型&#xff0c;特别适合部署为…

‌测试可访问性银行应用:面向软件测试从业者的专业实践指南

在金融数字化加速的今天&#xff0c;银行应用已成为用户获取金融服务的核心入口。然而&#xff0c;若应用未能满足可访问性标准&#xff0c;将直接导致数以亿计的残障用户被排除在金融服务之外。作为软件测试从业者&#xff0c;我们不仅是功能的验证者&#xff0c;更是数字包容…

新手如何从零到一落地实践接口自动化测试

为什么要做接口测试 测试理念的演变 早些时候&#xff0c;软件研发交付流程大多遵循V型或W型的瀑布模式。这种模式下&#xff0c;只有开发编码完成才会提测进入测试验证阶段。这个阶段测试同学做的大多是基于业务流程和页面的功能测试工作&#xff0c;也就是我们自嘲的“点工…

libusb异步编程模型图解说明:状态机流转分析

libusb异步编程的“心跳”&#xff1a;从状态机看懂非阻塞通信的本质你有没有遇到过这样的场景&#xff1f;写一个USB数据采集程序&#xff0c;用同步读取时&#xff0c;主线程卡得死死的——设备一没响应&#xff0c;整个系统就停摆。更糟的是&#xff0c;你想同时读多个端点、…

可访问性测试自动化挑战:技术深水区与破局之道

无法回避的数字包容性战场 全球超10亿残障用户依赖辅助技术访问数字产品&#xff0c;欧盟EN 301 549、美国Section 508等法规强制要求合规。Gartner预测到2027年&#xff0c;75%的企业将因可访问性缺陷面临法律诉讼。在此背景下&#xff0c;自动化测试从效率工具升级为风险防控…

新手必看:RS232串口通信常见问题与解决方法

RS232串口通信避坑指南&#xff1a;从乱码、断连到长距离传输的实战排错你有没有遇到过这样的场景&#xff1f;MCU代码写得一丝不苟&#xff0c;接线也反复检查了三遍&#xff0c;可串口调试助手一打开&#xff0c;收到的却是满屏“烫烫烫”或乱码字符&#xff1b;又或者通信几…

AI手势识别与追踪车载系统:驾驶中免触控操作实现

AI手势识别与追踪车载系统&#xff1a;驾驶中免触控操作实现 在智能汽车快速发展的今天&#xff0c;人机交互方式正经历深刻变革。传统的物理按键和触摸屏操作虽然直观&#xff0c;但在驾驶过程中容易分散驾驶员注意力&#xff0c;带来安全隐患。为解决这一痛点&#xff0c;AI…

测试可访问性教育平台

可访问性测试的教育需求 在数字化时代&#xff0c;软件可访问性&#xff08;Accessibility&#xff09;已成为全球合规与用户体验的核心要素。根据WCAG&#xff08;Web Content Accessibility Guidelines&#xff09;2.1标准&#xff0c;可访问性测试确保产品对所有用户&#…

Elasticsearch菜鸟教程:新手避坑指南(常见错误汇总)

Elasticsearch新手避坑指南&#xff1a;从踩坑到精通的实战经验你是不是也经历过这样的场景&#xff1f;刚装好Elasticsearch&#xff0c;兴奋地写入几条数据&#xff0c;结果一查发现字段类型不对&#xff1b;或者线上集群突然变慢&#xff0c;排查半天才发现是某个通配符查询…

人体姿态估计进阶:MediaPipe Pose模型压缩技术

人体姿态估计进阶&#xff1a;MediaPipe Pose模型压缩技术 1. 技术背景与挑战 随着AI在智能健身、虚拟试衣、动作捕捉等领域的广泛应用&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为计算机视觉中的核心技术之一。其目标是从单张RGB图像中检测…

从零开始学AI对话:Qwen2.5极速版手把手教学

从零开始学AI对话&#xff1a;Qwen2.5极速版手把手教学 1. 学习目标与前置知识 本教程将带你从零开始&#xff0c;快速上手使用 Qwen/Qwen2.5-0.5B-Instruct 极速对话机器人 镜像&#xff0c;实现一个支持中文问答与代码生成的本地化AI聊天应用。无论你是AI初学者还是希望在边…

UE5 C++(23-4):

&#xff08;134&#xff09; &#xff08;135&#xff09; 谢谢

风电最大化消纳的热电联产机组联合优化控制(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

GLM-4.6V-Flash-WEB企业部署:高可用架构设计实战案例

GLM-4.6V-Flash-WEB企业部署&#xff1a;高可用架构设计实战案例 智谱最新开源&#xff0c;视觉大模型。 快速开始 部署镜像&#xff08;单卡即可推理&#xff09;&#xff1b;进入Jupyter&#xff0c;在 /root 目录&#xff0c;运行 1键推理.sh&#xff1b;返回实例控制台&am…

智能打码系统参数调优:AI人脸隐私卫士高级技巧

智能打码系统参数调优&#xff1a;AI人脸隐私卫士高级技巧 1. 背景与挑战&#xff1a;为何需要智能打码系统&#xff1f; 在社交媒体、新闻报道和公共监控等场景中&#xff0c;图像和视频的广泛传播带来了巨大的隐私泄露风险。尤其是人脸信息&#xff0c;作为不可更改的生物特…