这段代码用于解决“从n个数字中选出一些数,使它们的和为偶数且尽可能大”的问题,逻辑清晰清晰且高效。以下是详细解释:
代码逻辑拆解
1. 核心思路
要得到最大的偶数和,需分两种情况:
* 若所有数字的总和本身是偶数,直接取总和(因为总和是最大可能的和)。
* 若总和是奇数,必须去掉一个奇数才能让剩余和为偶数(偶数=奇数-奇数)。此时应去掉最小的奇数,以保证剩余和最大。
* 特殊情况:若没有奇数(全是偶数)且总和为奇数(不可能,因为偶数和必为偶数),此时无法组成偶数和,返回0。
2. 变量定义
* n:输入的数字个数。
* s:存储所有数字的总和(用long long避免大数字相加溢出)。
* mo:记录最小的奇数(初始化为1e9,大于题目中最大可能的输入值1e6,确保能正确更新)。
* ho:标记是否存在奇数(0表示无,1表示有)。
3. 循环处理输入
遍历每个数字:
* 累加每个数字到总和s。
* 若数字是奇数(x%2 == 1):
* 标记ho = 1(存在奇数)。
* 若该奇数比当前mo小,更新mo为这个奇数(始终保留最小的奇数)。
4. 结果判断
* 若总和s是偶数:直接输出s(已是最大偶数和)。
* 若总和s是奇数:
* 若存在奇数(ho == 1):输出s - mo(减去最小的奇数,得到最大偶数和)。
* 若不存在奇数(ho == 0):输出0(无法组成偶数和)。
样例解析(输入#1)
* 输入:2 个数字 5 和 8。
* 总和s = 5 + 8 = 13(奇数)。
* 奇数有5,故ho = 1,最小奇数mo = 5。
* 总和为奇数,需减去最小奇数:13 - 5 = 8(偶数,且是最大可能的和)。
* 输出:8,与样例一致。
代码优势
* 高效性:仅遍历一次数字,时间复杂度为O(n),适合n达1e6的大规模输入。
* 正确性:通过记录最小奇数和判断奇偶性,确保在各种情况下都能得到最大偶数和。