您的位置:首页 > 其它

EOJ3003-最小向量点积

2020-04-05 18:20 232 查看

题目

两个向量a=[a1,a2,⋯,an] 和b=[b1,b2,⋯,bn] 的点积定义为 :

例如,两个三维向量 [1,3,−5] 和 [4,−2,−1] 的点积是

假设允许对每个向量中的坐标值进行重新排列。找出所有排列中点积最小的一种排列,输出最小的那个点积值。上例中的一种排列 [3,1,−5] 和 [−2,−1,4] 的点积为−27,这是最小的点积。

输入格式

第 1 行:一个整数 T (1⩽T⩽10) 为问题数。
接下来每个问题有 3 行。第 1 行是一个整数 n (1⩽n⩽1000),表示两个向量的维数。第2 行和第 3 行分别表示向量 a 和向量 b。每个向量都有 n 个由一个空格分隔的坐标值 (−1000⩽坐标值⩽1000) 组成。

输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。
然后对应每个问题在一行中输出最小点积值。

样例

input
3
3
3 1 -5
-2 -1 4
1
2
-298
5
1 2 3 4 5
1 0 1 0 1

output
case #0:
-27
case #1:
-596
case #2:
6

code

思路:一个递增,一个递减,乘积最小,数组的排序用到了

<algorithm>
中的sort函数

#include <iostream>
#include <algorithm>
using namespace std;

bool cmp(int a, int b)
{
return a > b;
}

int main() {
int N;
int num;
int a[1000];
int b[1000];
int sum;
cin >> N;
for (int i = 0; i < N; i++)
{
sum = 0;
cin >> num;
for (int j = 0; j < num; j++)
cin >> a[j];
for (int j = 0; j < num; j++)
cin >> b[j];
sort(a, a + num);
sort(b, b + num, cmp);
for (int j = 0; j < num; j++) {
sum += a[j] * b[j];
}
cout << "case #" << i << ":" << endl;
cout << sum << endl;

}
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
-avocado- 发布了15 篇原创文章 · 获赞 0 · 访问量 440 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: