cf 650 div3

题目

要注意,在此题里,除法的本质是每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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/107415627
今日推荐