要注意,在此题里,除法的本质是每x(x为除数)个位置放置一个东西
首先是判断有没有1,如果没有,我们可以让整个序列+k再除以k+1,+k是因为每k+1个位置放置一个人嘛,所以这样做可以确定第一个人放在第一位。
然后就是一段区间内,两边都有1和只有一边有1,只有一边有1直接0个数/k+1就可以了,两边都有1需要减去k再/k+1,这样是因为保证右边也有足够的空间
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<vector>
using namespace std;
int t,n,k,ans,cnt;
char s[200005];
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
ans=0;
vector<int>v;
cnt=0;
cin>>n>>k;
cin>>s+1;
int len=strlen(s+1);
for(int i=1;i<=len;i++)
{
if(s[i]=='1')cnt++;
}
if(cnt==0)
{
ans=(n+k)/(k+1);
cout<<ans<<endl;
//printf("%d\n",(n+k)/(k+1));
continue;
}
cnt=0;
v.push_back(0);
for(int i=1;i<=len;i++)
{
if(s[i]=='1')v.push_back(i);
}
v.push_back(len+1);
for(int i=1;i<=v.size()-1;i++)
{
/*printf("%d %d ",v[i],v[i-1]);
printf("%d\n",(v[i]-v[i-1]-1)/(k+1));*/
if(i!=1&&i!=v.size()-1)
{
ans+=(v[i]-v[i-1]-k-1)/(k+1);
}
else
ans+=(v[i]-v[i-1]-1)/(k+1);
}
cout<<ans<<endl;
}
}