CSDN之编程挑战赛-玩转算法:最小向量乘积

本文探讨了如何通过重新排列两个向量的维度以获得最小点积的问题,并提供了一个具体的算法实现示例。该算法首先将一个向量按升序排序,另一个向量按降序排序,然后计算它们的点积。
最小向量乘积15剩余时间:236天14小时59分53秒
编程语言:C C++ Java C#
答题时长:120分钟难度等级: 

两个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]之间。 输出格式: 对于每组数据,输出一行,包含一个整数,代表可以调整到的最小的点积。 收起更多介绍

已有148参与挑战,79人挑战成功
这道题的关键点在于两个向量使用不同的排序方式来求点乘结果,一个向量使用升序排序,则另一个使用降序排序,得到的点乘结果必然最小.
代码如下:
#include<iostream>
#include <algorithm>   
#include <vector>       


using namespace std;


bool comp1(int i, int j){return (i<j);}
bool comp2(int i, int j){return (i>j);}


void main()
{
cout<<"Input vector dimension:"<<endl;
int dim;
cin>>dim;
cout<<" vector dimension is "<<dim<<endl;
// 第1个向量
cout<<"1st vector:"<<endl;
vector<int> firstVec;
for (int i=0;i<dim;++i)
{
int temp;
cin>>temp;
firstVec.push_back(temp);
cout<<"1st vector-"<<i<<" value: "<<temp<<endl;
}

for (vector<int>::iterator iter = firstVec.begin(); iter!= firstVec.end();++iter)
{
cout<<"     "<<*iter;

}
cout<<endl;
// 第2个向量
cout<<"2nd vector:"<<endl;
vector<int> SecondVec;
for (int i=0;i<dim;++i)
{
int temp;
cin>>temp;
SecondVec.push_back(temp);
cout<<"2nd vector-"<<i<<" value: "<<temp<<endl;
}

for (vector<int>::iterator iter = SecondVec.begin(); iter!= SecondVec.end();++iter)
{
cout<<"     "<<*iter;


}
cout<<endl;
// 第1个向量降序排序输出
sort(firstVec.begin(),firstVec.end(),comp2);
for (vector<int>::iterator it = firstVec.begin(); it!= firstVec.end(); ++it)
{
cout<<" "<<*it;
}
cout<<endl;
// 第2个向量升序排序输出
sort(SecondVec.begin(),SecondVec.end(), comp1);
for(vector<int>::iterator it = SecondVec.begin();it!= SecondVec.end(); ++it)
{
cout<<" "<<*it;
}
cout<<endl;
// 计算2个向量的最小点乘结果并输出
int sum =0;
for (int i= 0; i<dim;++i)
{
sum += firstVec.at(i)* SecondVec.at(i);
}
cout<<"vector dot multi is:"<<sum<<endl;




system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值