【CF1833C】题解

本文章同步发表于洛谷

思路

首先,先明确一点:

  • 同奇偶的两个数相减,等于偶数。
  • 奇偶性不同的两个数相减,等于奇数。

接下来,我们要确定要都变成奇数还是偶数。

偶数?

如果是偶数,由于要同奇偶的两个数相减,结果才等于偶数。

又因为改变后的每个数都要 \(\gt0\),所以,最小的奇数没有可以与其相减的奇数。所以,变成偶数是错误的。

但是

如果都是偶数的话,其实是可以的,所以要谈判。

现在目标明确了,把所有偶数变成奇数。

显然,我们可以贪心的将每个偶数匹配最小的奇数,如果发现有一个偶数比这个奇数小,则输出 NO,否则,输出 YES

参考代码

#include<bits/stdc++.h>
using namespace std;
int t,n,a[200010];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		int minn=0x7fffffff;
		int s1=0,s2=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			if(a[i]&1) minn=min(minn,a[i]);
			if(a[i]&1) s1++;
			else s2++;
		}
		if(s1==n||s2==n){
			printf("YES\n");
			continue;
		}
		bool f=0;
		for(int i=1;i<=n;i++){
			if(a[i]%2==0){
				if(a[i]<minn){
					f=1;
					break;
				}
			}
		}
		if(f) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}
posted @ 2023-05-21 09:29  fengxiaoyi  阅读(57)  评论(0)    收藏  举报