每日水题(003-1)P2697 宝石串

这道题目讲述了使用二分查找法解决宝石串稳定区间的问题。通过将绿色珠子记为1,红色珠子记为-1,寻找前缀和为0的连续区间。由于数据范围限制,直接遍历不可行,采用前缀和结合二分查找法来找出满足条件的最大长度区间。在实现二分查找时,注意到奇数长度不能成为答案,且避免了常规二分查找可能导致的死循环错误,最终成功编写并解决了这个问题。
摘要由CSDN通过智能技术生成

一、算法分析

本来打算找一道水题做,结果这道题做了好久。。。对蒟蒻我来说这已经不算水题了。。。
可以把绿色珠子记为1,红色记为-1,这样的话,如果一个区间i~j的和为0,那么这个区间上的珠子就是“稳定”的,但是考虑数据范围,直接两层for循环找连续0是肯定不行的,所以就要求一下前缀和,这样只要找到距离最远的一对i和j,使得前缀和数组中a[j]-a[i]等于0即可,但是笔者仍然不会怎么找,想了好久突然想到,答案是单调的,也就是说如果有k个珠子满足条件,那k-2,k-4之类的也一定满足,而大于k的不一定满足,而且答案的可能区间很明显是1到n,这样不就可以二分了吗!!!然后下一个要解决的问题就是如何二分,这道题的二分的特殊性在于奇数不能成为答案,所以当mid等于奇数时要加1,于是愉快地写出代码,结果居然死循环!!!手算一下样例之后发现,笔者的二分代码中是l<=r,这个条件在其他二分题中通常适用,但是在本题中却造成了死循环,模拟了一下样例,发现可以改成l<r,这样就不会死循环了。

二、代码及注释

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000005;
char st[maxn];
int a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值