思路
- 把每一个能放1的区间的长度求出来,这个区间可以放的最多1就是(len-1)/(k+1)+1,len为区间长度
代码
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct point{
int l,r;
bool operator < (const point& b){
return l<b.l||(b.l==l&&r<b.r);
}
};
vector<point> a;
int main(){
int T;
cin >> T;
int n,k;
while(T--){
cin >> n >> k;
a.clear();
for(int i=0;i<n;i++){
char x;cin >> x;
if(x=='1')a.push_back({max(0,i-k),min(n-1,i+k)});
}
int res=0;
if(a.size()==0){
cout << (n-1)/(k+1)+1 << "\n";
continue;
}
sort(a.begin(),a.end());
int idx=0;
for(int i=0;i<a.size();i++){
if(idx<a[i].l){
int tmp=a[i].l-idx;
if(tmp>=k){
res+=(tmp-1)/(k+1)+1;
}else{
res++;
}
}
idx=a[i].r+1;
}
if(idx<n){
int tmp=n-idx;
if(tmp>=k){
res+=(tmp-1)/(k+1)+1;
}
else{
res++;
}
}
cout << res << "\n";
}
}