You are given an array a with n elements. Each element of a is either 0 or 1.
Let's denote the length of the longest subsegment of consecutive elements in a, consisting of only numbers one, as f(a). You can change no more than k zeroes to ones to maximize f(a).
Input
The first line contains two integers n and k (1 ≤ n ≤ 3·105, 0 ≤ k ≤ n) — the number of elements in a and the parameter k.
The second line contains n integers ai (0 ≤ ai ≤ 1) — the elements of a.
Output
On the first line print a non-negative integer z — the maximal value of f(a) after no more than k changes of zeroes to ones.
On the second line print n integers aj — the elements of the array a after the changes.
If there are multiple answers, you can print any one of them.
Sample Input
7 1 1 0 0 1 1 0 1
4 1 0 0 1 1 1 1
10 2 1 0 0 1 0 1 0 1 0 1
5 1 0 0 1 1 1 1 1 0 1
题意: 给你N个数,让你改变其中的K个0为1;使得连1的长度最长
思路:把它看成是花费得到每个点对于第一个点的花费dp[i],按照二分查找的思想来写,在每一个位置上去找当前花费dp[i]+k的最小值所在的位置来记录比较
AC代码:
有进步啦#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> using namespace std; int n,k; int dp[300005]; int a[300005]; int main() { memset(dp,0,sizeof(dp)); cin >> n >> k; for(int i = 1; i <= n; i++) { cin >> a[i]; if(a[i] == 0) { dp[i] = dp[i-1]+1; } else { dp[i] = dp[i-1]; } } int ans = 0; int s = 0; for(int i = 1; i <= n; i++) { int index; if(a[i] == 0) {//当前值为0说明当前的花费有一个 index = upper_bound(dp,dp+n+1,dp[i]+k-1)-dp; } else { index = upper_bound(dp,dp+n+1,dp[i]+k)-dp; } if(index - i > ans) { ans = index-i; s = i; } } printf("%d\n",ans); int i; for(i = 1; i < s; i++) { printf("%d ",a[i]); } for(; i <= n && k != 0; i++) { printf("1 "); if(a[i] == 0) { k--; } } for(; i<= n; i++) { printf("%d ",a[i]); } return 0; }