我正在尝试通过首先对向量进行排序然后将向量的最后两个元素相乘来解决最大对乘积问题。
它适用于较小的数字,但不适用于10 ^ 5的数字。
任何人都可以找出来并提供帮助吗?
这是我的功能
long long MaxPairwiseProductFast(const vector<int> &number)
{
long long result = 0;
long n = number.size();
result = number.at(n-1) * number.at(n-2);
return result;
}
这是我的主要功能
int main()
{
int n;
cin>>n;
vector<int>numbers(n);
for(int i = 0; i <n; i++){
cin>>numbers[i];
}
sort(numbers.begin(), numbers.end());
long long result = MaxPairwiseProductFast(numbers);
cout<<result<<"\n";
return 0;
}
对于较小的范围,它可以正常工作,但是即使使用了很长的时间,也不能在较大的范围内
答案 0 :(得分:1)
首先,您需要将向量int
写入long long
的任何地方,将向量的数据类型从vector<int>number
更改为vector<long long>number
。
要获得正确的输出,您需要做的另一项更改是,您必须考虑至少有两个更大的负数的情况。
例如:如果vector包含:{-10, -5, -2, 0, 1, 2}
。
您的程序将输出:1 * 2 = 2
作为答案。
但是,这种情况的答案将是:-10 * -5 = 50
。
因此,正确的计算方法将是:
long long MaxPairwiseProductFast(const vector<long long> &number)
{
long long result = 0;
long n = number.size();
if (n < 2) return 0;
result = number.at(n-1) * number.at(n-2);
result = max(result, number.at(0) * number.at(1));
return result;
}
答案 1 :(得分:1)
您不需要像其他答案所建议的那样更改所有数据类型。只需像这样修复乘法:
long long MaxPairwiseProductFast(const vector<int> &number)
{
long long result = 0;
long n = number.size();
result = number.at(n-1) * (long long)number.at(n-2);
return result;
}
问题在于您要将两个int * int
乘以一个int
,然后 then 将其返回为long long
。您需要在乘法之前 强制转换其中之一,这样它才能与结果long long
进行long long
乘法。
还要检查最小两个数字的乘积,因为 -5 * -5> 4 * 4