题目 链接
题目大意
给一个只有0和1的具有偶数个元素的序列,从中删去最多 n 2 \frac{n}{2} 2n 个元素,然后使得奇数位置上的元素总和和偶数位置上的元素总和相同。
题目简析
脑洞,只要最后序列只留下1或者0即可满足条件。
为了简化过程我把1的个数记作
a
a
a,把0的个数记作
b
b
b。
有以下几种情况。
- 0的个数要大于1的个数
那么说明1的个数就少于 n 2 \frac{n}{2} 2n个,删去全部的1,剩下的0满足条件。 - 1的个数要大于0的个数
因为序列是偶数的原因,所以当 a > b a > b a>b时,满足 a − b > = 2 a - b >= 2 a−b>=2。然后把0全部删掉,剩下的全都是1,这里需要注意一个问题,如果此时的 a a a是奇数,那么应当多删去一个1,让序列长度为偶数。 - 1的个数等于0的个数
删去全部的1即可,奇数个0不受影响。
综上所述,只有两种可能,当 a > b a > b a>b时,删除全部的0,并且若 a a a是奇数,额外多删去一个1;当 a < = b a <= b a<=b时,删除全部的1。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N];
int main() {
// freopen("in.txt", "r", stdin);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int cnt_one = 0, cnt_zero = 0;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) {
if (a[i] == 0) cnt_zero++;
else cnt_one++;
}
if (cnt_one > cnt_zero) {
cout << cnt_one - (cnt_one & 1) << endl;
for (int i = 0; i < cnt_one - (cnt_one & 1); i++) cout << 1 << " ";
}
else{
cout << cnt_zero << endl;
for (int i = 0; i < cnt_zero; i++) cout << 0 << " ";
}
cout << endl;
}
return 0;
}