序列只包含 0 或 1 可以进行k次操作 将任意位置的0变为1 求最长连续1 的长度 并输出更改后序列的值
思路: 先说这是邪教 根据尺取法的原理 先取出最小的满足区间 区间整体移动l-r 若移动后的l-r满足题意 判断l-r+1是否满足 满足更改区间长度及左右端点 不满足继续移动 直到遍历整个区间.
ACcode:
#include<iostream>
#include<cstdio>
using namespace std;
int a[300005];
int main()
{
int n, k, cnt0 = 0;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
int l = 1, r = 1, st = 0, ed = -1, cnt = 0, num = 0;
if (a[1] == 0)
cnt = 1;
while (1)
{
while (cnt <= k) // 判断是否满足题意
{
if (r - l + 1 > num) //满足总长度是否大于ans
{
st = l;
ed = r;
num = r - l + 1; //记录ans
}
r++;
if (a[r] == 0 && r <= n)
cnt++;
if (r > n)
{
r = n; //整体移动
break;
}
}
r++;
if (a[r] == 0 && r <= n)
cnt++;
if (r > n)
r = n;
if (a[l] == 0)
cnt--;
l++;
if (l > n)
break; //遍历完序列输出
}
for(int i = st; i <= ed; i++)
a[i] = 1;
printf("%d\n", num);
for (int i = 1; i <= n; i++)
{
if (i == 1)
printf("%d", a[i]);
else
printf(" %d", a[i]);
}
printf("\n", num);
return 0;
}