原题链接:
题意:
一个长度为 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;
}