算法
注意到,如果有奇数多个奇数数字的话,那么$x$个数字之和必为奇数。
我们可以首先维护两个变量$odd$和$even$,分别表示数组中奇数的数量和偶数的数量。然后我们可以遍历0到$odd$,每扫过奇数个($i$)奇数时,判断$x-i$是否小于等于$even$。
C++ 代码
#include <iostream>
#define rep(i, n) for (int i = 0; i < n; ++i)
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, x;
cin >> n >> x;
int odd = 0, even = 0;
rep(i, n) {
int a;
cin >> a;
(a & 1 ? odd : even)++;
}
bool ok = false;
rep(i, odd + 1) {
if (i & 1 && i <= x && x - i <= even) ok = true;
}
cout << (ok ? "Yes" : "No") << '\n';
}
return 0;
}