题意:
给定n和x,并输入一个长度为n的数组,问能否找出x个数相加为奇数,如果可以输出yes,不然输出no
思路:
数的和为奇数还是偶数关系到奇数和偶数的多少,所以首先统计奇数和偶数的多少。然后再想一下它们的和与奇数和偶数个数的关联,奇数的个数必须是奇数个才可以,并且此时的所需要偶数个数应该小于所有的偶数个数,于是就从1一直模拟到odd的个数。
另一个方法,只存在三种情况为no。1.odd=0。2.even=0并且x为偶数。3.x=n并且odd=偶数。
//法1
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,x,s[1005],odd=0,even=0;
cin>>n>>x;
for(int i=0;i<n;i++){
cin>>s[i];
if(s[i]%2!=0) odd++;
else even++;
}
int flag=0;
for(int i=1;i<=odd&&i<=x;i=i+2){
int j=x-i;
if(j<=even) {
flag=1;break;
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
//法2
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,x,s[1005],odd=0,even=0;
cin>>n>>x;
for(int i=0;i<n;i++){
cin>>s[i];
if(s[i]%2!=0) odd++;
else even++;
}
if(odd==0) cout<<"No"<<endl;
else if(even==0&&x%2==0) cout<<"No"<<endl;
else if(x==n&&odd%2==0) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
套路:模拟和规律