CF1363A 题解
题目简述
共有 \(T\) 组数据。
对于每组数据,给定 \(n,x\) 和 \(n\) 个数,问是否可以从 \(n\) 个数中选 \(x\) 个使其和为奇数,可以输出 Yes
,否则输出 No
。
思路
首先在输入过程中记录奇数的个数,接着特判没有奇数的情况,直接输出 No
即可。
接着如果奇数有偶数个,则把奇数个数减一,因为我们拿着偶数个奇数没有任何用处,所以扔掉一个即可。
下面判断 \(x\) 是否大于奇数个数,如果大于且剩余偶数可补上空缺,可输出 Yes
;如果不大于则判断是否有偶数或 \(x\) 为奇数,满足其中一个即可输出 Yes
;否则输出 No
。
下面是代码实现:
#include<iostream>
using namespace std;
int T, n, x;
int main() {
cin >> T; // 多组输入
while(T --) {
int sum = 0; // 初始化奇数个数
cin >> n >> x;
for(int i = 1, tmp; i <= n; i++) {
cin >> tmp;
if (tmp & 1) sum++; // 如果是奇数则加 1
}
if(!sum) {
cout << "No\n"; // 没有奇数特判输出 No
continue; // 直接返回
}
if(!(sum & 1)) sum --, n --; // 奇数个数为偶数处理
if(x >= sum && (x - sum) <= (n - sum)) { cout << "Yes\n"; continue; } // 情况 1
if(x < sum)
if((n - sum) > 0 || x % 2 != 0) { cout << "Yes\n"; continue; } // 情况 2
printf ("No\n"); // 情况 3,直接输出 No
}
return 0;
}
\[\text{The End!}
\]
本文来自博客园,作者:So_noSlack,转载请注明原文链接:https://www.cnblogs.com/So-noSlack/p/17601074.html