「EZEC-5」修改数组
题目描述
给定一个长度为 n n n、元素由 0 0 0 或 1 1 1 组成的数组。
现在可以选择若干(可以为 0)个值为 0 0 0 的元素,将其修改为 1 1 1。
记:
- x x x 为数组中最长连续 1 1 1 子段的长度(规定,若所有数均为 0 0 0,则 x x x 为 0 0 0);
- y y y 为修改的元素的个数。
求要怎么修改才能使 x − y x-y x−y 最大,并构造一个方案(输出修改后的数组)。
输入格式
本题含有多组数据。
第一行一个整数 T T T 表示数据组数。
接下来 2 × T 2\times T 2×T 行,每 2 2 2 行表示一组数据。
在一组数据中,第一行一个整数 n n n,表示数组的长度;
第二行 n n n 个整数(0 或 1),表示给定的数组。
输出格式
共 2 × T 2\times T 2×T 行,每 2 2 2 行表示一组数据。
在一组数据中,第一行输出一个整数表示 x − y x-y x−y 的最大值;
第二行 n n n 个整数(0 或 1)表示修改以后的数组。如有多个方案,任意输出一种即可。
样例 #1
样例输入 #1
1
1
1
样例输出 #1
1
1
样例 #2
样例输入 #2
2
3
1 0 1
5
0 1 0 1 0
样例输出 #2
2
1 1 1
2
0 1 1 1 1
提示
本题采用捆绑测试。
对于所有数据,保证 T ≤ 10 , 1 ≤ n ≤ 1 0 5 T\le10,1\le n\le 10^5 T≤10,1≤n≤105,数组元素 ∈ { 0 , 1 } \in \{0,1\} ∈{0,1}。
- Subtask 1(70 points):保证 1 ≤ n ≤ 10 1\le n\le 10 1≤n≤10;
- Subtask 2(30 points):无特殊限制。
代码
#include<iostream>
using namespace std;
const int N = 1e5+10;
int w[N];
int T,n;
int main(){
cin>>T;
while(T--){
cin>>n;
int c1=0;
for(int i=1;i<=n;i++){
cin>>w[i];
if(!w[i]){
c1++;
}
}
cout<<(n-c1)<<endl;
for(int i=1;i<=n;i++){
cout<<1<<' ';
}
cout<<endl;
}
return 0;
}