球思路~~
题面:
题目链接
自己向下翻可以找到题解的
我编过了,55分
就是这个:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll maxsum;
ll n, k;
string s;
ll cnt;
ll a[100005], sum[100005];
int main() {
cin >> n >> k >> s;
ll i;
int f=0;
for (i = 0; i < n; i++) {
if (s[i] == '1') {
int t1 = 0;
while (i < n && s[i] == '1') {
i++;
t1++;
}
i--;
a[++cnt] = t1;
} else {
int t2 = 0;
while (i < n && s[i] == '0') {
i++;
t2++;
}
i--;
a[++cnt] = t2;
}
}
for (ll i = 1; i <= cnt; i++) {
sum[i] = sum[i - 1] + a[i];
}
for (ll i = 2 * k + 1; i <= cnt; i += 2) {
maxsum = max(sum[i] - sum[i - 2 * k - 1], maxsum);
}
cout << maxsum;
return 0;
}
@览遍千秋 你在吗?
文字版题目发一下,我发我同学看看
2 个赞
题目描述
小信有一个长度为 n的只含 0 和 1 的字符串 s
。 他可以进行最多 k 次如下操作:
选择字符串 s 的一个子串,将其中的字符反转(0 变成 1,1 变成 0)。
求在操作过程中(操作数可为 0 )出现过的最长的连续的 1 的长度。
输入格式:
第一行 2 个正整数 n,k;
第二行一个字符串 s。
输出格式:
输出不超过 k 次操作后,最长的连续的 1 的长度。
emmm,大概瞪出来了
就是维护两个指针(l,r),窗口内最多有k个0
不断扩张右边界r,当0的数量大于k时,移动左边界
维护一个cnt记录窗口内0的个数
记录窗口的最大长度
然后我就不细说了
2 个赞
干哈