首页 > 代码库 > GCJ——Minimum Scalar Product(2008 Round1 AA)

GCJ——Minimum Scalar Product(2008 Round1 AA)

题意:

  给定两组各n个数,可任意调整同一组数之中数字的顺序,求 sum xi*yi i=1..n的最小值。

Small: n<=8

    abs xy,yi<=1000

Large: n<=800

    abs xi,yi <= 100000

 

假如两个数字之和为固定,那么两数字之积最大当且仅当两两数字尽量接近。

所以,直觉告诉我们——将x升序排列,y降序排列,所得对应积最大。

因为顺序可以任意调整,所以我们完全可以固定x的数字顺序,仅仅思考y的数字顺序。

验证:

当n=2时:

  当仅有两个数的时候 x1,x2,y1,y2 ,假定标号大的数字也大。

  x1*y2+x2*y1 - (x1*y1 + x2*y2)

  x1(y2 - y1) + x2 (y1-y2)

  (x1-x2)(y2-y1) < 0

  显然,n=2的情况下是符合的。

  

当n>2时:

  假设最优解中,存在 ya,yb,有b>a且ya>yb(不是按照降序排列的),显然根据n=2,交换他们的位置,就会得到更小的答案。

所以,假设正确。

  另外,还有很重要的一点,就是在Larger数据下,xi*yi是可能会溢出int的(10^10),数据要选择好。

GCJ——Minimum Scalar Product(2008 Round1 AA)