2 条题解

  • 0
    @ 2026-6-4 13:15:54
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int L[N],R[N],a[N];
    signed main()
    {
    	int n,k;cin>>n>>k;int len=0;
    	L[++len]=1;R[len]=1;
    	for(int i=1;i<=n;i++)scanf("%1d",&a[i]);
    	for(int l=1;l<=n;l++)if(a[l]==1)
    	{
    		int r=l;
    		while(r<=n&&a[r+1]==1)r++;
    		len++;L[len]=l,R[len]=r;
    		l=r;
    	}
    	int ans=0;
    	for(int i=1;i<=k;i++)L[++len]=n,R[len]=n;
    	for(int i=1;i+k<=len;i++)
    		ans=max(ans,R[i+k]-L[i]+1);
    	cout<<ans;
    	return 0;
    }
    • 0
      @ 2026-6-3 16:15:09

      题目传送门

      此题明显是双指针。

      我们可以把 0101 串给分割,就像这样:

      把他分割成元素相同的子序列。

      用两个数组,aia_i 表示第 ii 个子序列的元素个数,visivis_i 表示第 ii 个子序列的元素是什么。

      此时我们应该用双指针求最大包含 mm 个的区间的最大长度是多少。

      CODE:

      #include<bits/stdc++.h>
      #define int long long
      using namespace std;
      int a[100001],cnt;
      bool vis[100001];
      signed main(){
      	int n,m;cin>>n>>m;
      	string s;cin>>s;
      	s=' '+s;
      	int now=1;
      	while(now<=n){
      		int ans=1;
      		while(s[now]==s[now+1])now++,ans++;
      		now++;
      		a[++cnt]=ans;
      		if(s[now-1]=='0')vis[cnt]=1;
      	}//O(n)分割
      	int res=0,k=0;//k用于记录区间内0块的个数
      	int ans=0;
      	for(int l=1,r=1;r<=cnt;r++){
      		res+=a[r];
      		if(vis[r])k++;
      		while(k>m&&l<=r)res-=a[l++],k-=vis[l-1];//双指针模版,记得要把0块剪掉
      		ans=max(ans,res);//求最大值
      	}cout<<ans;
      	return 0;
      }
      
      • 1

      信息

      ID
      11647
      时间
      2000ms
      内存
      1024MiB
      难度
      8
      标签
      递交数
      15
      已通过
      5
      上传者