题目大意
给两个列表,从这两个列表中分别取出任意数量的元素相乘求和,要求所能得到的最大和是多少
输入
每组包含一个测试用例,每个用例第一行是第一个列表的长度,第二行就是这个列表的各个元素,第三行是第二个列表的长度,最后一行是第二个列表的各个元素。每个列表的长度在 [ 1 , 1 0 5 ] [1,10^5] [1,105],列表元素是不超过 2 30 2^{30} 230的整数
输出
对每个用例,输出能得到的最大的乘积和
解析
这题可用贪心解。对每个列表分别划分成正数和负数,然后排序。用正数中最大的乘以最大的,负数中最小的乘以最小的
# -*- coding: utf-8 -*-
# @Time : 2019/6/1 10:05
# @Author : ValarMorghulis
# @File : 1037.py
def solve():
n1 = eval(input())
a = list(map(int, input().split()))
pa = list()
na = list()
for i in a:
if i < 0:
na.append(i)
if i > 0:
pa.append(i)
n2 = eval(input())
b = list(map(int, input().split()))
pb = list()
nb = list()
for i in b:
if i < 0:
nb.append(i)
if i > 0:
pb.append(i)
ans = 0
pa = sorted(pa, reverse=True)
na = sorted(na)
pb = sorted(pb, reverse=True)
nb = sorted(nb)
for i in range(min(len(pa), len(pb))):
ans = ans + pa[i] * pb[i]
for i in range(min(len(na), len(nb))):
ans = ans + na[i] * nb[i]
print(ans)
if __name__ == "__main__":
solve()