1 条题解

  • 0
    @ 2026-5-4 22:00:01

    解题思路

    关键思想xx 个数的和为奇数,当且仅当我们从中选择了奇数个奇数。(这显然是一个正确的说法)

    详细解释
    首先维护两个变量 num_oddnum_even,分别表示数组中奇数和偶数的个数。然后我们枚举可能选择的奇数个数 iiii 取值为 1,3,5,1, 3, 5, \dots,直到 min(num_odd,x)\min(\text{num\_odd}, x)。对于每个 ii,检查剩余的 xix - i 个元素是否都能由偶数提供,即判断 num_evenxi\text{num\_even} \ge x - i 是否成立。如果存在这样的 ii,则输出 "Yes",否则输出 "No"

    时间复杂度:O(n)O(n)

    #include <bits/stdc++.h>
    using namespace std;
     
    #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #define endl "\n"
    #define int long long
     
    const int N = 2e5 + 5;
     
    int n, x;
    int a[N], f[2];
     
    int32_t main()
    {
    	IOS;
    	int t;
    	cin >> t;
    	while(t--)
    	{
    	    f[0] = f[1] = 0;
        	cin >> n >> x;
        	for(int i = 1; i <= n; i++)
        	{
        		cin >> a[i];
        		f[a[i] % 2]++;
        	}
        	bool flag = 0;
        	for(int i = 1; i <= f[1] && i <= x; i += 2) //Fix no of odd
        	{
        		int have = f[0], need = x - i;
        		if(need <= f[0])
        	        flag = 1;
        	}
        	if(flag)
        	    cout << "Yes" << endl;
        	else
        	    cout << "No" << endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6842
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者