【题解】Vasya and String(贪心 + 尺取法)

八中OJ
洛谷

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

贪心选择性质:算法中每一步选择都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未做的选择。

尺取法的思想也是贪心,贪的是复杂度。他也是依赖于以前的选择,以达到避免重复计算的目的。

代码:

#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);
}

遍历了所有情况,记得每次都取最小值

posted @ 2020-02-02 14:40  仰望星空的蚂蚁  阅读(10)  评论(0)    收藏  举报  来源