详细题解,保你AC(记得看解析!)
2025-11-08 22:51:20
发布于:广东
2阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
long long s = 0;
int mo = 1e9;
bool ho = 0;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
s += x;
if (x % 2 == 1) {
ho = 1;
if (x < mo) mo = x;
}
}
if (s % 2 == 0) {
cout << s << endl;
}else{
if (ho) cout << s - mo << endl;
else cout << 0 << endl;
}
}
这段代码用于解决“从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的大规模输入。 - 正确性:通过记录最小奇数和判断奇偶性,确保在各种情况下都能得到最大偶数和。
这里空空如也







有帮助,赞一个