c++算法基础必刷题目——尺取法

news2025/2/26 5:53:47

文章目录

  • 尺取法
    • 1、字符串
    • 2、丢手绢

尺取法

  尺取法通常也叫滑动窗口法,顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以说尺取法是一种高效的枚举区间的方法,是一种技巧,一般用于求取有一定限制的区间个数或最短的区间等等

1、字符串

NC18386 字符串

题目描述
  小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。

输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.

输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。

示例1
输入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu

输出
49

解题思路:
1、通过滑动窗口记录不同字符的个数,当包含了26个不同字符时缩小窗口,直到恰好不包括26个不同字符时停止,取最优解

2、详细的步骤在代码中有解释

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    int a[26]={0};//a[0]代表字符a的个数,a[1]代表字符b的个数,依次下去
    int j=0;//用来滑动窗口
    int ans=INT_MAX;//一个足够大的值即可
    int sum=0;//sum代表区间里不同字符的个数
    for(int i=0;i<s.size();i++){
        a[s[i]-'a']++;
        if(a[s[i]-'a']==1){//如果个数从0变为1,那么区间不同字符数+1
            sum++;
        }
        while(sum==26){//如果区间不同字符数等于26,代表所有字符都包含
            a[s[j]-'a']--;
            if(a[s[j]-'a']==0){
                sum--;
                ans=min(ans,i-j+1);//取最优解
            }
            j++;
        }
    }
    cout<<ans<<endl;
}

2、丢手绢

NC207040 丢手绢

题目描述
  “丢~丢~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”

  牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。

  因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。

输入描述:
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。
接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。
最后一行是第N个小朋友顺时针到第一个小朋友的距离。

输出描述:
输出一个整数,为离得最远的两个小朋友的距离。

示例1
输入
3
1
2
3

输出
3

备注:
2≤N≤100000
距离和(圆圈周长)小于等于2147483647

解题思路:
这是一个环型的尺取问题,从哪里开始都没有问题,最终全部判断完即可,下面解释样例:
在这里插入图片描述

1、开始,l和r都在a点,目前不是最优状态,r往顺时针方向走到b,目前也不是最优状态,r往顺时针方向走到c,达到最优状态,记录答案

2、a点达到最优状态后往顺时针方向走到b,此时判断r是否是最优状态,可以发现r只会往顺时针方向走

3、依次判断完所有的点的最优状态,取最优解即可

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[100010]={0};
    int n;
    cin>>n;
    int sum1=0,sum2=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum2+=a[i];
    }
    int j=0;
    int ans=0;
    for(int i=0;i<n;i++){
        if(i){
            sum1-=a[i-1];
            sum2+=a[i-1];
        }
        while(sum2-a[j]>sum1+a[j]){
            sum2-=a[j];
            sum1+=a[j];
            j++;
        }
        ans=max(ans,min(sum1,sum2));
        ans=max(ans,min(sum1+a[j],sum2-a[j]));
    }
    cout<<ans<<endl;
    
}

是不是很简单呢?

刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

文章尚有不足,欢迎大牛们指正

感谢观看,点个赞吧

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

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

相关文章

Html网页和C++ App通信 - qwebchannel

Qt5 引入了 Qt WebChannel 的概念。这是为了在不能影响各端代码执行的前提下实现 Qt 端于 client 端的无缝 双向 通信。 QWebChannel 提供了在 C应用和 前端&#xff08;HTML/JS&#xff09;之间点对点的通信能力。通过向 前端的 QWebChannel 发布 QObject 的 派生对象&#xf…

开源版支持工作台展示,新增超级管理员用户组,MeterSphere开源持续测试平台v2.5.0发布

2022年12月27日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.5.0版本。 在这一版本中&#xff0c;MeterSphere在工作台模块进行了UX交互升级&#xff0c;并将工作台模块由X-Pack增强功能开放为开源版功能。 在测试跟踪模块中&#xff0c;关联测试用例支持关联UI…

(四)RequestResponse

一、Request 和 Response 的概述 Request是请求对象&#xff0c;Response是响应对象。request&#xff1a;获取请求数据 &#xff08;1&#xff09;浏览器会发送HTTP请求到后台服务器 [Tomcat] &#xff08;2&#xff09;HTTP的请求中会包含很多请求数据[请求行请求头请求体] &…

26位前谷歌AI专家出走创业

细数近几年来高科技对现代社会的影响&#xff0c;人工智能&#xff08;AI&#xff09;无疑是排在前列。AI已经对人类社会行为、健康、教育和娱乐的方方面面都产生了巨大冲击。作为高科技的头部企业&#xff0c;谷歌的AI团队可能是AI行业最有影响的团队之一&#xff0c;他们的一…

第十三讲:MSTP技术应用

学校因为教师的人数越来越多&#xff0c;部门逐渐也增多&#xff0c;各部门之间都已经采用了vlan技术&#xff0c;但为了实现公司的稳定性和消除内部网络的环路&#xff0c;管理员小赵配合飞越公司去实现学校内部网络时刻不间断&#xff0c;来保证公司网络的运行。 为了解决校园…

【Lilishop商城】No4-3.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-微信小程序登录接口开发

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代码…

工厂明火烟雾视频监控识别 烟火自动识别预警 yolo

工厂明火烟雾视频监控识别 烟火自动识别预警通过pythonyolo网络深度学习模型可以自动识别监控区域内的烟火&#xff0c;如pythonyolo网络深度学习模型发现火焰烟火可以立即抓拍告警。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流行&#x…

Flink系列-2、Flink架构体系

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录Flink中的重要…

[ web基础知识点 ] 解决端口被占用的问题(关闭连接)(杀死进程)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

什么是文件描述符

Linux内核在各种不同的文件系统格式之上做了一个抽象层&#xff0c;使得文件、目录、读写访问等概念成为抽象层的概念&#xff0c;因此各种文件系统看起来用起来都一样&#xff0c;这个抽象层称为虚拟文件系统(VFS&#xff0c;Virtual Filesystem)。 内核数据结构 Linux内核的V…

【endnote学习】解决为什么文献引用后出现年/月/日格式(endnote对其他类型引用文件的不兼容导致)

为什么文献引用后出现年/月/日格式问题描述问题解决问题描述 在一次文献引用中发现&#xff0c;引用后的文献格式里面多了年/月/日格式&#xff0c;比如选择AIChE格式时&#xff0c;出现&#xff1a; Liu P, Nrskov JK. Kinetics of the Anode Processes in PEM Fuel Cells …

编译原理——基本块、流图、基本块优化、循环优化(代码优化)

一、划分基本块、画流图 找基本块的入口&#xff1a;一共有三类入口&#xff1a;①代码段的第一个指令&#xff1b;②条件跳转和无条件跳转的目标语句&#xff1b;③条件跳转语句的下一条语句&#xff1b;根据划分的入口画流图&#xff0c;一个基本块的区间&#xff1a;从入口…

C++: STL : 容器:set/multi set,map/multimap

一&#xff1a;set容器 1.1: set容器的构造和赋值 简介&#xff1a;所有元素都会在插入时自动被排序 本质&#xff1a;set/multiset 属于关联式容器 &#xff0c;底层结构是二叉树实现 set与multiset区别&#xff1a; set: 不 允许容器中有重复元素 multiset &#xff1a;允…

Shader Graph(一)基本使用

一、如何使用Shader Graph 1.1 新建项目 通过创建URP或HDRP模板项目&#xff0c;可以自动配置好Shader Graph。 1.2 已有项目 在「Package Manager」中安装「Shader Graph」及URP或HDRP组件。然后在弹出的渲染管线向导面板中点击「Fix All」即可。如果项目中存在已经创建好…

three.js实战-Sprite实现标签效果

1. demo效果 2 .什么是精灵(Sprite) 按照Three.js官网的解释是&#xff1a;精灵是一个总是面朝着摄像机的平面&#xff0c;通常含有使用一个半透明的纹理。精灵不会投射任何阴影&#xff0c;即使设置了也将不会有任何效果。 3. 代码大致逻辑 创建一个canvas对象,首先调用ctx…

密码学_DES加密算法

目录 DES&#xff08;Data Encryption Standard&#xff09; IP置换&#xff1a; E盒扩展 S盒压缩 P盒置换 K密钥生成 PC-1置换表&#xff08;通常用此表&#xff09;&#xff1a; PC-2置换表&#xff08;通常用此表&#xff09;&#xff1a; IP-1逆置换表 DES&#x…

MyBatis的SQL执行结果和客户端执行结果不一致问题排查

MyBatis的SQL执行结果和客户端执行结果不一致问题排查问题引入测试表、测试数据问题介绍排查问题调试 MyBatis源码JDBC 执行 SQL解决问题待解决问题最近遇到一个调试很久的问题&#xff0c;MyBatis 查询 Oracle 数据库查询结果与在客户端查询结果不一致。 问题引入 测试表、测…

自动化审批流程有哪些?使用中的优点是什么

自动化审批对HR管理有多重要呢&#xff1f;相信每一位HR都会希望让审批流程实现自动化&#xff0c;从而释放更多的时间去处理更加复杂的工作。 在人力资源管理过程中&#xff0c;自动化审批可以有效帮助HR提高流程效率。当管理人员每天收到很多审批请求之后&#xff0c;如果不…

AVS3中的AMVR和EMVR

在AVS2中运动预测中使用的MV都是1/4像素精度&#xff0c;通过在整像素间插值能显著提升非整像素运动预测的精度&#xff0c;同时带来的问题是随着MV精度的提高编码MVD所需的比特数也会增加。 AMVR AMVR支持的MVD编码5种精度的MVR{1/4,1/2,1,2,4}&#xff0c;索引为0到4&#x…

IU5706 外置MOS、33V输出大功率同步升压芯片产品介绍

概要 IU5706E是高性能宽输入范围&#xff08;4.5V~24V&#xff09;同步升压控制器&#xff0c;支持高达33V的输出电压。输出电压采用恒定频率电流模式脉宽调制&#xff08;PWM&#xff09;控制来实现调节。 芯片通过外部定时电阻器或通过与外部时钟信号同步来设置开关频率。在电…