【发布时间】:2016-05-08 14:44:06
【问题描述】:
我正在尝试计算两个数组/向量的最小点积。详情如下:
问题:给定两个序列 a1, a2, . . . , 和 b1, b2, . . . , bn, 求第二个序列的排列 π 使得 a1, a2, 的点积。 . . , an 和 bπ1, bπ2, . . . , brπn 最小。
我的逻辑工作正常,但是当我尝试如下输入时,由于整数溢出而失败。我将使用哪些数据类型来适应我的条件 1 ≤ n ≤ 10^3; −10^5 ≤ ai, bi ≤ 10^5 对于所有 1 ≤ i ≤ n
1
99999
99999
上述场景的输出应该是 9999800001 ,但我得到的是 1409865409
#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
using std::vector;
int64_t min_dot_product(int n, vector<int> a, vector<int> b) {
int64_t result = 0;
if (n != 0)
{
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
std::reverse(a.begin(), a.end());
/*for (long long int i = 0; i < n; i++) {
result += a[i] * b[n - 1 - i];
}*/
result = std::inner_product(a.begin(), a.end(), b.begin(), 0);
}
return result;
}
int main() {
int n;
std::cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
for (int i = 0; i < n; i++) {
std::cin >> b[i];
}
std::cout << min_dot_product(n, a, b) << std::endl;
}
【问题讨论】:
-
你不应该改变a的顺序,只能改变b。
-
另外,
std::next_permutation您可能也感兴趣。 -
不,即使我也改变了 a 的顺序,它也可以工作,我已经测试过了。
-
其实你是对的。如果 a 不变,则 a 顺序的任何更改都与结果 b 的更改相同。
-
我想了解我问的问题是否有问题?因为它被某人投了反对票。欢迎任何意见。
标签: c++ algorithm dot-product