Codeforces Round #797 (Div. 3) D题:
原题链接
题目描述:
大意:给一个字符串,包含W,B两种字符,有一个操作可以把W变为B,求能达到连续K个W,需要操作的次数最小是多少?
分析: 遍历字符串,用前缀和维护W出现的次数,W为1,B为0,然后再遍历前缀和数组,以k为窗口大小。取min,即为答案;
AC代码:
#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<limits.h>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=2e5+10;
int arr[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
int n,k;
string s;
cin>>t;
while(t--){
cin>>n>>k;
cin>>s;
int res=INT_MAX;
for(int i=1;i<=n;i++){
arr[i]=arr[i-1]+(s[i-1]=='W');
}
// for(int i=1;i<=n;i++){
// cout<<arr[i]<<' ';
// }
// cout<<endl;
for(int i=0;i+k<=n;i++){
res=min(res,arr[i+k]-arr[i]);
}
cout<<res<<endl;
}
return 0;
}