「EZEC-5」修改数组(构造+贪心)

「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 xy 最大,并构造一个方案(输出修改后的数组)。

输入格式

本题含有多组数据。

第一行一个整数 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 xy 的最大值;

第二行 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 T10,1n105,数组元素 ∈ { 0 , 1 } \in \{0,1\} {0,1}

  • Subtask 1(70 points):保证 1 ≤ n ≤ 10 1\le n\le 10 1n10
  • 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;
}
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

green qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值