csdn 最小向量乘积

来源:互联网 发布:linux 中断 工作队列 编辑:程序博客网 时间:2024/04/29 11:43

题目:
两个N维向量的点积定义为,对应维度上的数的乘积之和。
两个三维向量[1, 3, −5]和[4, −2, −1]的点积是1 * 4 + 3 * (-2) + (-5) * (-1) = 3
现在允许我们对两个向量里的维度重新排列,让点积尽可能小。
例如上述两个向量,我们可以调整维[3,1,-5]和[-2,-1,4],点积是-27。
输入格式:
多组数据,每组数据第一行是一个整数n,表示向量的维数。1<=n<=100000。
下面两行,每行是n个空格分隔的整数表示两个n维向量,每一维的范围都是[-1000000,+1000000]之间。
输出格式:
对于每组数据,输出一行,包含一个整数,代表可以调整到的最小的点积。

分析:
要想最后得到的结果最小,所以要把大的数尽量和小的数相乘。我们将第一个向量按升序排序,第二个向量按降序排序,然后计算所有a[i]*b[i]的和,即为所求。

下面附上代码:

#include <algorithm>#include <functional>#include <iostream>#include <cstdio>using namespace std;typedef long long ll;const int maxn = 100000;int n;int a[maxn],b[maxn];ll res;int main(){  int i;  while(scanf("%d",&n) == 1){    for(i = 0; i < n; i++){      scanf("%d",&a[i]);    }    for(i = 0; i < n; i++){      scanf("%d",&b[i]);    }    sort(a,a+n,greater<int>());    sort(b,b+n);    res = 0;    for(i = 0; i < n; i++){      res += 1LL*a[i]*b[i];    }    printf("%I64d\n",res);  }    return 0;}
0 0
原创粉丝点击