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.所需内存如下
底下这个是错的
原先的代码是这样的,但是就无法在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;