题目描述
给定一个 01
序列 b1b2...bn,01
的意思就是这个数列里只有 0
与 1
。
请问最少需要将多少个 1
改成 0
,序列里会出现至少 k 个连续的 0
。
输入格式
- 第一行:两个整数 n 与 k。
- 第二行:n 个字符表示 b1b2...bn,保证只出现
0
与1
。
输出格式
单个整数:最少要改多少个 1
,才会出现 k 个连续的 0
。
数据范围
- 对于 30%30% 的数据,1≤k≤n≤20;
- 对于 60%60% 的数据,1≤k≤n≤2000;
- 对于 100%100% 的数据,1≤k≤n≤500,000
样例数据
输入:
6 3
101010
输出:
1
说明:
改最后一个1
输入:
5 5
00100
输出:
1
题解:
本题关键点:滑动窗口法来解。代码如下。
cpp
#include <iostream>
using namespace std;
int main(){
string s;
int size=0;
int n, k;
cin >> n >> k;
cin >> s;
int ans=n;
for(int left=0,right=0;right<n;right++){
//进窗口
if(s[right]=='1') size++;
if(right-left==k){
//出窗口
if(s[left]=='1') size--;
left++;
}
if(right>=k-1){
ans=min(ans,size);
}
}
cout<<ans<<endl;
return 0;
}