Black & White
题目链接:https://ac.nowcoder.com/acm/contest/893/F
题目描述:
你有一个长度为 n 的 01 串S,你可以执行最多 m 次操作。对于每次操作,你可以选择一个位置 i 满足 1≤i≤n 翻转这一位的值,0变成1,1变成0。定义一个 01 串的价值为其中最长连续0的个数和最长连续1的个数的较大值,求S在经过最多m次操作后的最大价值。
思路:
可以用尺取法来解决,最长连续0和最长连续1可以统一为求最长连续0,只要翻转0为1,1为0,再求一次,取较大值即可。
尺取法一般可分为4步:
1.初始化左右端点
2.不断扩大右端点,直到满足条件
3.如果第二步中无法满足条件,则终止,否则更新结果
4.将左端点扩大1,然后回到第二步
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
string s;
int solve(){
int l=0,r=0,ans=0,cnt=0;
while(r<n){
if(s[r]=='1') cnt++;
while(cnt>m){
if(s[l]=='1') cnt--;
l++;
}
ans=max(ans,r-l+1);
r++;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--){
cin>>n>>m;
cin>>s;
int re=solve();
for(int i=0;i<n;++i){
if(s[i]=='1') s[i]='0';
else s[i]='1';
}
re=max(re,solve());
cout<<re<<endl;
}
}