C++最小内积

Description

向量是几何中的一个重要概念。

考虑两个向量 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<=100,代表了向量的维数。

第二行是N个非负整数,给出了v1 中的元素,每个整数都在32位整数的范围内,用一个空格隔开。

第二行是N个非负整数,给出了v2 中的元素,每个整数都在32位整数的范围内,用一个空格隔开。

 

Output

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

 

==========================================================开始整C++的分割线=====================================================================

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     //先接收向量的维数,再接收向量,
10     //对向量进行排序,在计算内积vec1.reserve(length);
11 
12     vector<int> vec1,vec2;
13     int length;
14     cin >> length;//动态分配内存
15     vec1.reserve(length);
16     vec2.reserve(length);
17     int number;
18     int time = 0;
19     int sum = 0;
20     while(time < length && cin >> number ){
21         vec1.insert(vec1.begin()+time,number);
22         time ++;
23     }
24     time = 0;
25     while(time < length && cin >> number){
26         vec2.insert(vec2.begin()+time,number);
27         time ++;
28     }
29     //排序:vec1顺序  vec2逆序
30     sort(vec1.begin(),vec1.end());
31     sort(vec2.begin(),vec2.end());
32     reverse(vec2.begin(),vec2.end());
33 
34     //vector<double>::iterator it;//得到迭代器对象
35     for(int i = 0;i < length; ++i){
36         sum += (vec1[i]*vec2[i]);
37 
38     }
39     cout << sum << endl;
40     return 0;
41 
42 }

keypoint:

1.最上面的三个库一定要导入!!前两个不用多说,第三个是使用sort()、reverse()方法的关键

2.代码有待优化  从line20 — line28是重复的代码,可以用一个循环包裹,降低代码冗余

3.line34的循环输出可以定义一个迭代器

4.所需内存如下

 C++最小内积

 

 

 

 

底下这个是错的

原先的代码是这样的,但是就无法在vec2中插入数据,打印出来的是数组的地址(我也不知道为啥。。有愿意解决这个的朋友欢迎留言)

 1 vector<int> vec1,vec2;
 2     int length;
 3     cin >> length;
 4     vec1.reserve(length);
 5     vec2.reserve(length);
 6     int number;
 7     for(int i = 0;i < 1; i++){
 8         int time = 0;
 9         while(cin >> number && time < length){
10             if(!i){
11                 vec1.push_back(number);
12             }else{
13                 vec2.push_back(number);
14 
15             }
16             time ++;
17         }
18     }
19     //排序:vec1顺序  vec2逆序
20     sort(vec1.begin(),vec1.end());
21     sort(vec2.begin(),vec2.end());
22     //reverse(vec2.begin(),vec2.end());
23 
24     //vector<double>::iterator it;//得到迭代器对象
25     for(int i = 0;i < length; ++i){
26         cout << vec2[i] << endl;
27     }
28     return 0;

 

 

 

 

 

 

 

原文链接: https://www.cnblogs.com/apprendre-10-28/p/12427834.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++最小内积

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/333676

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午9:18
下一篇 2023年3月1日 下午9:18

相关推荐