华为OD机试(C卷+D卷)2024真题目录(Java & c++ & python)
题目描述
给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。
说明:
- 数组中数字范围[0, 1000]
- 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1
- 输入非法返回-1
输入描述
第一行输入M, M标识数组大小
第二行输入M个数,标识数组内容
第三行输入N,N表达需要计算的最大、最小N个数
输出描述
输出最大N个数与最小N个数的和
用例1
输入
5
95 88 83 64 100
2
输出
342
说明: 最大2个数[100,95],最小2个数[83,64], 输出为342。
用例2
输入
5
3 2 3 4 2
2
输出
-1
说明: 最大2个数[4,3],最小2个数[3,2], 有重叠输出为-1。
解题思路
- 输入和去重:首先读取数组和参数N,然后对数组进行去重。
- 输入验证:检查数组长度是否足够大,是否存在合法的最大N个数和最小N个数。
- 排序和计算:
- 对去重后的数组进行排序。
- 提取最大N个数和最小N个数,并检查是否有重叠。
- 输出结果:如果存在重叠,返回-1,否则返回这些数的和。
参考代码
def main():
import sys
input = sys.stdin.read
data = input().split()
M = int(data[0])
arr = list(map(int, data[1:M+1]))
N = int(data[M+1])
unique_elements = list(set(arr))
if len(unique_elements) < 2 * N:
print(-1)
return
unique_elements.sort()
sum_min = sum(unique_elements[:N])
sum_max = sum(unique_elements[-N:])
if unique_elements[N-1] >= unique_elements[-N]:
print(-1)
else:
print(sum_min + sum_max)
if __name__ == "__main__":
main()