[题目描述]
为了庆祝“华为杯”的举办,校园中开展了许多有趣的热身小活动。小理听到这个消息非常激动,他赶忙去参加了糖果俱乐部的活动。
该活动的规则是这样的:摊位上有 n 堆糖果,第 i 堆糖果有 ai 个,参与的同学可以选择其中的任意堆,当所选择糖果的总数为偶数就可以把它们都带走啦~
试问通过这个活动小理最多能在摊位上带走多少枚糖果。
输入格式:
输入共两行。
第1行 输入一个整数 n ,代表共有 n 堆糖果。
第2行 依次输入 n 个整数 ai ,代表每堆糖果的数量。
输出格式:
输出一个整数,代表小理最多能取得的糖果。
样例输入#1
4
1 2 3 4
样例输出#1
10
样例输入#2
8
10 11 10 10 10 10 10 10
样例输出#2
70
数据范围
对于 100% 的数据,保证 n≤100 且 ai≤100000 。
来源/分类(难度系数:一星)
完整代码展示:
a=int(input())
b=list(map(int,input().split()))
c=[]
d=[]
for i in range(0,len(b)):
if b[i]%2==0:
c.append(b[i])
else:
d.append(b[i])
d.sort()
if len(d)%2==0:
sum=sum(c)+sum(d)
else:
sum=sum(c)+sum(d)-d[0]
print(sum)
代码解释:
“a=int(input())
b=list(map(int,input().split()))
c=[]
d=[] ”,让用户输入糖果的堆数a。建立一个列表b,储存各堆糖果的具体糖果数。建立空列表c和d(各用来储存糖果数为偶数和奇数的糖果堆)。
“for i in range(0,len(b)):
if b[i]%2==0:
c.append(b[i])
else:
d.append(b[i]) ”,遍历列表b中元素(各糖果堆的糖果数),如果为偶数,则将其添加进列表c中;否则将其添加进列表d中。直至遍历完b中所有元素,循环结束。
“d.sort()
if len(d)%2==0:
sum=sum(c)+sum(d)
else:
sum=sum(c)+sum(d)-d[0] ”,对列表d中元素进行升序排序,如果列表d的长度为偶数,则能带走的最多糖果数为列表c与列表d中所有元素的总和;否则能带走的最多糖果数为列表c与列表d中除第一项的所有元素的总和。(这里蕴含一个数学基本原理:奇数+奇数=偶数,偶数+偶数=偶数,奇数+偶数=奇数,因此欲求为偶数的最大总和,可先求出所有偶数的总和(列表c中所有元素的总和),再加上尽可能多的偶数个奇数的和(列表d中元素个数为偶数,全加;为奇数,不加最小的一项d[-1]))
“print(sum) ”,打印最终结果(为偶数的最大总和)。
运行效果展示: