原题链接:
Problem - C - Codeforces
题意:
一个长度为 n 的 01 序列,你可以把其中 m 个 0 变成 1 (),问最多能有多少连续的 1
解法:
双指针。
可以指向一段序列的端点判断合不合法。可以用前缀和维护 l ~ r 中 1 的个数。
时间复杂度:O(n)
Code :
#include<bits/stdc++.h>
using namespace std;int arr[300005], s[300005], n, k, l = 1, ans = 0, ll = 0, rr = 0;int main(){scanf("%d%d", &n, &k);for (int i = 1;i <= n;i++){scanf("%d", &arr[i]);if (arr[i] == 0) s[i] = s[i-1] + 1;else s[i] = s[i-1];}for (int r = 1;r <= n;r++){if (s[r] - s[l-1] <= k){if (ans < r-l+1){ans = r-l+1;ll = l, rr = r;}}else while (s[r] - s[l-1] > k) l++;}printf("%d\n", ans);for (int i = 1;i <= n;i++){if (i >= ll && i <= rr) printf("1 ");else printf("%d ", arr[i]);}return 0;
}