Black & White(尺取)
链接:https://ac.nowcoder.com/acm/contest/893/F
来源:牛客网
* 第一行一个整数 T ,表示接下来有 T 个样例。
* 首先输入n,m,表示S串的长度n和操作次数m,其中1≤n≤1000001≤n≤100000,0≤m≤10000≤m≤1000;
* 接下来输入一个长度为n的字符串S。
输出描述:
一个整数,表示题面上描述的最大价值。
示例1
说明
第一个串翻转第三个位置,00001的价值为4;第二个串翻转第一个位置,11的价值为2。
思路:记录每个串中1的位置和0的位置,然后尺取
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<set> #include<vector> #include<cmath> const int maxn=1e5+5; typedef long long ll; using namespace std; string str; int l[maxn]; int main() { int T; cin>>T; while(T--) { int n,m; scanf("%d%d",&n,&m); cin>>str; l[0]=-1; int cnt=1; for(int t=0;t<n;t++) { if(str[t]=='1') { l[cnt++]=t; } } l[cnt++]=n; // cout<<cnt<<endl; if(m>=cnt-2) { printf("%d\n",n); continue; } int ans=0; for(int t=1;t<cnt-m;t++) { ans=max(ans,l[t+m]-l[t-1]-1); } cnt=1; l[0]=-1; for(int t=0;t<n;t++) { if(str[t]=='0') { l[cnt++]=t; } } l[cnt++]=n; if(m>=cnt-2) { printf("%d\n",n); continue; } for(int t=1;t<cnt-m;t++) { ans=max(ans,l[t+m]-l[t-1]-1); } cout<<ans<<endl; } return 0; }
作者:李斌
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步