题意:
给你一个有 n 个元素的数组 a 。 a 中的每个元素要么是 0 要么是 1 。
我们把 a 中连续元素的最长子段(仅由数字 1 组成)的长度记为 f(a) 。为了使 f(a) 最大,你可以将不超过 k 个 0 改为 1。
思路:双指针。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"
void solve()
{
int n,k;
cin>>n>>k;
vector<int> a(n+5);
for(int i=1;i<=n;i++) cin>>a[i];
int cnt=0;
int la=0,ra=0;
int res=0;
for (int l=1,r=1;r<=n;r++){
cnt+=!a[r];
if (cnt>k){
cnt-=!a[l];
l++;
}
if (r-l+1>res)res=r-l+1,la=l,ra=r;
}
for(int i=la;i<=ra;i++) a[i]=1;
cout<<res<<endl;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
t=1;
//cin>>t;
while(t--){
solve();
}
system("pause");
return 0;
}