【题解】Vasya and String(贪心 + 尺取法)
尺取法:顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等。
贪心选择性质:算法中每一步选择都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未做的选择。
尺取法的思想也是贪心,贪的是复杂度。他也是依赖于以前的选择,以达到避免重复计算的目的。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int n,k,ans,t1,t2;
char a[MAXN];
int main() {
scanf("%d%d ",&n,&k);
for(int i=1;i<=n;i++) scanf("%c",&a[i]);
int l=1,r=1;
t1=t2=k;
while(r<=n&&l<=r) {
if(a[r]=='b') t1--;
if(t1<0) {
while(a[l]=='a') l++;
l++;
t1=0;
}
ans=max(ans,r-l+1);
r++;
}
l=1,r=1;
while(r<=n&&l<=r) {
if(a[r]=='a') t2--;
if(t2<0) {
while(a[l]=='b') l++;
l++;
t2=0;
}
ans=max(ans,r-l+1);
r++;
}
printf("%d",ans);
}
遍历了所有情况,记得每次都取最小值

浙公网安备 33010602011771号