计算最小点积c ++

时间:2016-05-08 14:44:06

标签: c++ algorithm dot-product

我正在尝试计算两个数组/向量的最小点积。以下是详细信息:

问题:给出两个序列a1,a2 ,. 。 。 ,和b1,b2 ,. 。 。 ,bn,找到第二序列的置换π,使得a1,a2,...的点积。 。 。 ,an和bπ1,bπ2,. 。 。 ,bπn是最小的。

我的逻辑工作正常但是当我尝试输入如下时,由于整数溢出而失败。我将使用哪些数据类型来满足我的条件1≤n≤10^ 3;对于所有1≤i≤n

,-10 ^5≤ai,bi≤10^ 5

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;
}

1 个答案:

答案 0 :(得分:3)

进行以下更改:

  1. vector<int>替换为vector<int64_t>,以64位整数存储号码。

  2. 使用result = std::inner_product(a.begin(), a.end(), b.begin(), 0LL);
    0LL建议结果为int64_t

  3. 问题是你将它存储在int32_t中,因此乘法溢出。