最小内积

最小内积

向量是几何中的一个重要概念。
考虑两个向量 v1=(x1,x2,…,xn)和v2=(y1,y2,…,yn),向量的内积定义为
x1y1+x2y2+…+xnyn
例如向量(1,9,8,8)和(0,9,1,1)的内积是1×0+9×9+1×8+1×8=97。
下面我们考虑这样一个问题,如果我们能够任意的重新排列v1 和v2 中的分量(但是不能修改,删除和添加分量),然后再计算内积。显然这样计算的内积取决于选择的重排方式。
我们现在要问的是,通过重排向量中的分量,所能够获得的最小的内积是多少呢?
Input

输入数据包含3行。
第一行是一个整数N,N<=1000,代表了向量的维数。
第二行是N个整数,给出了v1 中的元素,每个整数都在32位整数的范围内,用一个空格隔开。
第二行是N个整数,给出了v2 中的元素,每个整数都在32位整数的范围内,用一个空格隔开。
Output

输出一个整数,代表了通过重排向量中的分量,所能够获得的最小内积值。数据保证了最后结果在32位整数的范围内。
Sample Input

5
1 2 3 4 5
1 0 1 0 1
Sample Output

6
Source

第八届北京师范大学程序设计竞赛决赛
Author

huangkun @ BNU

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int A[1001],B[1001];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=1;i<=n;i++) scanf("%d",&A[i]);
        for(int i=1;i<=n;i++) scanf("%d",&B[i]);
        sort(A+1,A+n+1);sort(B+1,B+n+1);//WA了一次 忘了sort的左闭右开区间
        long long ans = 0;
        for(int i=1,j=n;i<=n;i++,j--) ans += A[i] * B[j];
        cout <<ans<<endl;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值