CF1363A 题解

发布时间 2023-08-02 16:37:57作者: So_noSlack

洛谷链接&CF 链接

题目简述

共有 \(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!} \]