这道题yaozhaoguilv
题目描述:
有两个向量 v1 = (x1, x2, x3, ..., xn),v2 = (y1, y2, y3, ..., yn)。允许任意交换 v1 和 v2 的分量顺序,试计算 v1 和 v2 的内积 x1y1 + x2y2 + ... + xn *yn 的最小值。(1 <= n <= 800,-1000 <= xi <= 1000, -1000 <= yi <= 1000)
输入描述:
第一行输入一个正整数 n,表示每个向量中的分量数目。
第二行输入向量 v1 的 n 个整数分量,每个分量之间用一个空格分隔。
第三行输入向量 v2 的 n 个整数分量,每个分量之间用一个空格分隔。
输出描述:
一个整数,占一行,两个向量乘积的最小值。
样例输入:
3
1 3 -5
-2 4 1
样例输出:
-25
思想:一个从小到大排列,一个从大到小排列
乘积最小。
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int n,i,j; 5 while(cin>>n){ 6 long v1[n]; 7 long v2[n]; 8 long sum=0,p,q; 9 for(i=0;i<n;i++){ 10 cin>>v1[i]; 11 } 12 for(i=0;i<n;i++){ 13 cin>>v2[i]; 14 } 15 for(i=0;i<n-1;i++){ 16 for(j=0;j<n-i-1;j++){ 17 if(v1[j]>v1[j+1]){ 18 p=v1[j]; 19 v1[j]=v1[j+1]; 20 v1[j+1]=p; 21 } 22 if(v2[j]<v2[j+1]){ 23 q=v2[j]; 24 v2[j]=v2[j+1]; 25 v2[j+1]=q; 26 } 27 } 28 } 29 for(i=0;i<n;i++){ 30 sum=sum+v1[i]*v2[i]; 31 } 32 cout<<sum<<endl; 33 } 34 return 0; 35 }