这是Code Jam 2008, Round 1A的试题
Problem
对于两个矢量v1,v2,scalar product定义为x1y1+x2y2+...+xnyn。假如你现在可以任意改变两个矢量中每个值的位置,要求得到一个能使scalar product最小的情况。
Input
第一行给出test case数量T
对于每个test case,第一行给出矢量的长度n
后两行分别给出v1和v2两个矢量,每一行包括n个整数。
Output
对于每个test case,输出
Case #X: Y
其中X是test case的编号,Y是最小的scalar product
Sample
Input | Output |
2 | Case #1: -25 |
源代码:
fin = open('A-large-practice.in', 'r')
fout = open('A-large-practice.out', 'w')
T = int(fin.readline()) # the number of test cases
for cases in xrange(T):
n = int(fin.readline()) # each vector contains n integers
v1 = map(int, fin.readline().split())
v2 = map(int, fin.readline().split())
sum = 0
for i in xrange(n):
sum += sorted(v1)[i] * sorted(v2)[-i - 1]
fout.write("Case #%d: %d\n" %(cases + 1, sum))
fin.close()
fout.close()
观察之后发现,要想得到最小的scalar product,首先用第一行的最大整数乘以第二行的最小整数,再用第一行的第二大整数乘以第二行的第二小整数,以此类推。得到方法之后,程序的实现并不复杂。