码迷,mamicode.com
首页 > 其他好文 > 详细

编程题-最小向量内积-(1)

时间:2015-02-09 18:24:33      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:向量最小内积

有两个向量v1=(x1,x2,...,xn)v2=(y1,y2,...,yn),允许任意交换v1v2各自的分量的顺序,计算v1v2的内积x1y1+x2y2+...+xnyn的最小值
样例:
输入:
n=3
v1=(1,3,?5)
v2=(?2,4,1)
输出:
-25
( 令v1=(?5,1,3)v2=(4,1,?2) )

首先我第一感觉就是,要保证最小,
1.如果在有正有负的情况下,那么有最大的正数乘以最小的负数,
2.如果都是正数,用最大的正数乘以最小的正数,
3.如果都是负数,用最大的负数数乘以最小的负数,
其实以上的3个条件就是两个向量分别按照升序和降序排列,得到的内积最小
按照上面的方法,不断的从v1v2取出配对的量,最后得出的结果可能是最优的结果。

举个样例试一试
v1=(x1,x2) ,v2=(y1,y2)
如果v1已经是按照升序排列,即x1x2,比较 x1×y1+x2×y2x1×y2+x2×y1的大小
(x1×y1+x2×y2)?(x1×y2+x2×y1)
=(x1(y1?y2)+x2(y2?y1))
=(x1?x2)(y1?y2)
可以看出,如果y1<y2,即x1×y1+x2×y2>x1×y2+x2×y1
意味着,我们可以通过交换y1y2的位置得到一个更小的向量内积值
延伸到 n>2
我们也同样把V1按照升序排列,对于v2如果存在 i<j,yi<yj我们可以通过交换yiyj的位置,得到一个更小的例子
x1y1+...+xiyi+...+xjyj+...+xnyn>x1y1+...+xiyj+...+xjyi+...+xnyn

#include <iostream>
#include <algorithm>

using namespace std;
int compare(int a,int b)
{
    return a>b;
}
int main()
{
    int n,i;
    cout<<"input n: ";
    cin>>n;
    cout<<endl;
    cout<<"input v1 :"<<endl;
    int *v1=new int[n];
    int *v2=new int[n];
    for(i=0;i<n;i++)
    {
        cin>>v1[i];
    }
    cout<<"input v2 :"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>v2[i];
    }
    //v1 升序
    sort(v1,v1+n);
    //v2 降序
    sort(v2,v2+n,compare);
    int min=0;
    for(i=0;i<n;i++){
        min+=v1[i]*v2[i];
    }
    cout<<"minimum is :"<<min<<endl;
    delete [] v1;
    delete [] v2;
    return 0;
}
input n: 3

input v1 :
1 3 -5
input v1 :
-2 4 1
minimum is :-25

编程题-最小向量内积-(1)

标签:向量最小内积

原文地址:http://blog.csdn.net/lizo_is_me/article/details/43672911

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!