2 条题解
-
0
#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
此题明显是双指针。
我们可以把 串给分割,就像这样:

把他分割成元素相同的子序列。
用两个数组, 表示第 个子序列的元素个数, 表示第 个子序列的元素是什么。
此时我们应该用双指针求最大包含 个的区间的最大长度是多少。
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
- 上传者