题意:长度为n的01字符串s,满足任意两个相邻1中0的个数大于k,现在使0变成1同时满足相邻1间0的个数大于k,问最多能变几次
思路:
1.
顺着标记一下,当si==1,此后si~si+k均不能改变
同理到着标记一下,当si==1,此后si-k~si均不能改变
最后顺着模拟一下即可,当此时位置i可以变为1时别忘记继续往后跳k位
代码:
#include <set> #include <map> #include <stdio.h> #include <string.h> #include <cmath> #include <algorithm> #include <iostream> #include <vector> #define pb push_back #define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0) #define fi first #define se second using namespace std; const int INF = 0x3f3f3f3f;//????? typedef long long ll; typedef long double ld; typedef pair<ll, int> pll; typedef pair<int, int> pii; const int N = 1000000; int a[55],b[55],prime[N],st[N];ll sum[N]; bool vis[200005]; int cnt; ll qpow(ll x,ll y,ll mod) { int ans=1; while(y) { if(y&1) ans=ans*x%mod; x=x*x%mod; y>>=1; } return ans%mod; } void ola() { for(int i=2;i<=1000000;i++) { if(st[i]==0) { prime[cnt++]=i; } for(int j=0;j<cnt&&i*prime[j]<=1000000;j++) { st[i*prime[j]]=1; if(i%prime[j]==0) break; } } } int main() { IOS; int t; cin >> t; while(t--) { int n,k; cin >> n >> k; string s; cin >> s; int len=s.size(); memset(vis,true,sizeof(vis)); for(int i=0;i<len;i++) { if(s[i]=='1') { vis[i]=false; for(int j=0;j<k&&i<len;j++) { i++; vis[i]=false; } } } for(int i=len-1;i>=0;i--) { if(s[i]=='1') { vis[i]=false; for(int j=0;j<k&&i>=0;j++) { i--; vis[i]=false; } } } int ans=0; for(int i=0;i<len;i++) { if(vis[i]==false) continue; ans++; for(int j=0;j<k&&i<len;j++) { i++; vis[i]=false; } } cout << ans << endl; } return 0; }2.
分情况 a:全为0时,先将第一位改为1,然后加上剩下的区间/(k+1),即ans=1+(n-1)/(k+1)
b:有1时,判断第一位是否为1,如果不为1判断是否能改变成1,如果能,ans=ans+1+(剩余区间)/(k+1)
c:两个1相邻,ans=ans+(剩余区间)/(k+1)
d:考虑一下最后一个1所在的位置,ans=ans+(n-1-最后一个1所在位置)/(k+1)
代码:
int n,k; cin >> n >> k; string s; cin >> s; int len=s.size(); cnt=0;//统计有几个1 for(int i=0;i<len;i++) { if(s[i]=='1') { b[cnt++] = i;//用数组b标记第cnt个1所在的位置 } } if(cnt==0) { cout << 1+(n-1)/(k+1) << endl; } else { int ans=0; if(b[0]!=0&&b[0]>=k+1) { ans=ans+1+(b[0]-k-1)/(k+1); } for(int i=1;i<cnt;i++) { ans=ans+(b[i]-b[i-1]-k-1)/(k+1); } ans=ans+(n-1-b[cnt-1])/(k+1); cout << ans << endl; }