题目链接
题意:从数组中选x个数使得这x个数加起来的总和是奇数
思路一:暴力枚举
分析:统计奇数和偶数个数,x个数一定是由a个偶数和x-a个奇数组成,枚举偶数个数,如果偶数总个数不小于当前枚举的a,且奇数个数不小于x-a,同时x-a也是奇数,此时符合条件
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
bool solve(int odd,int even,int x)
{
for(int i=0;i<=x;i++){
if(((x-i)&1)&&odd>=x-i&&even>=i)return true;
}
return false;
}
int main()
{
int t;
cin>>t;
while(t--){
int n,x,m;
cin>>n>>x;
int odd=0,even=0;
for(int i=0;i<n;i++){
cin>>m;
if(m&1)odd++;
else even++;
}
if(solve(odd,even,x))puts("Yes");
else puts("No");
}
return 0;
}
思路二:思维
分析:分情况讨论,如果x==n,此时奇数个数为奇数则打印Yes,否则No,x!=n的时候如果全为偶数或者全都是奇数且x是偶数的时候打印Yes,否则都是No,因为全为偶数的时候肯定不可能符合选出x个数使得和为奇数,全为奇数的话只能选奇数,此时如果x为偶数得到的和必然是偶数;对于除此以外的其他情况,因为奇数加偶数个数必然不小于x,那么必然可以通过选出奇数个奇数剩余用偶数填充的方法选出x个数
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,x,m;
cin>>n>>x;
int odd=0,even=0;
for(int i=0;i<n;i++){
cin>>m;
if(m&1)odd++;
else even++;
}
if(x==n){
if(odd&1)puts("Yes");
else puts("No");
}else{
if(!odd||(!even&&(x%2==0)))puts("No");
else puts("Yes");
}
}
return 0;
}