ABC272C Max Even 最大偶数

思路

题目翻译成数学语言就是让我们求这个式子:

\[\max _{i ,j\in [1,N],i\neq j} \{(A_i+A_j )\in \{x|x=2n,n\in \mathbb{N}_+\}\} \]

我们知道两个数的和为偶数只有两种可能:两个都是奇数或两个都是偶数。所以分类讨论即可。因为只有两个数,对顺序之类的没有要求,可以使用贪心的思想。找到最大的两个奇数 \(O_1,O_2\) 和最大的两个偶数 \(E_1,E_2\) 。最后输出两个奇数的和与两个偶数的和的最大值。即:

\[\max\{O_1+O_2,E_1+E_2\} \]

需要特判的是,如果偶数不足两个,就只能输出奇数;奇数不足两个,就只能输出偶数;两种都不足,输出-1 报错。

代码

#include<bits/stdc++.h>
using namespace std;
int n,a,odd1,odd2,even1,even2,sumo,sume,cnto,cnte;
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a);
		if(a&1){ //这里等价于 a%2==1
			cnto++;
			if(a>odd1)odd2=odd1,odd1=a;
			else if(a<=odd1&&a>odd2)odd2=a;
		}//统计最大奇数
  		else{
			cnte++;
			if(a>even1)even2=even1,even1=a;
			else if(a<=even1&&a>even2)even2=a;
		}//统计最大偶数
	}sumo=odd1+odd2,sume=even1+even2;
	if(cnto<2 && cnte<2)puts("-1");//如果都不足
	else if(cnto<2)printf("%d",sume);//奇数不够两个
	else if(cnte<2)printf("%d",sumo);//偶数不够两个
	else printf("%d",max(sumo,sume));//都够了就输出更大值
	return 0;
}

posted @ 2022-11-12 10:49  robinyqc  阅读(90)  评论(0)    收藏  举报