两个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");
}
#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");
}
本文探讨了如何通过重新排列两个向量的维度以获得最小点积的问题,并提供了一个具体的算法实现示例。该算法首先将一个向量按升序排序,另一个向量按降序排序,然后计算它们的点积。
2700

被折叠的 条评论
为什么被折叠?



