当前位置: 代码迷 >> 综合 >> cf 650 div3
  详细解决方案

cf 650 div3

热度:39   发布时间:2024-01-29 12:57:46.0

题目

要注意,在此题里,除法的本质是每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);}elseans+=(v[i]-v[i-1]-1)/(k+1);}cout<<ans<<endl;}
}