使用排序方法求解 Maxium Pairwise Product
Posted
技术标签:
【中文标题】使用排序方法求解 Maxium Pairwise Product【英文标题】:Solving Maxium Pairwise Product using Sort Method 【发布时间】:2019-05-02 09:24:24 【问题描述】:我试图通过首先对向量进行排序然后将向量的最后两个元素相乘来解决最大成对乘积问题。
它适用于较小的数字,但不适用于 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;
它适用于较小的范围,但即使在使用 long long 后也不适用于较大的范围
【问题讨论】:
当你说它不起作用时,哪里出了问题?你有失败的例子吗?我猜这是一个在线法官?你需要记住所有的数字吗?你需要全部排序吗?你只需要最大的两个。 你试过调试吗? 【参考方案1】:首先,您需要将向量的数据类型从int
更改为long long
,在您将vector<int>number
写入vector<long long>number
的任何地方。
为了得到正确的输出,你需要做的另一个改变是,你必须考虑至少有两个更大的负数的情况。
例如:如果向量包含:-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;
【讨论】:
感谢您的帮助! ? @ShivanjaliChaurasia,如果您可以接受答案,您可以将其标记为已接受。您应该能够点击的问题附近应该有一个勾号。谢谢!! 哦,好吧!我不知道,因为我是新来的。谢谢。【参考方案2】:您不需要像其他答案所建议的那样更改所有数据类型。只需像这样修复您的乘法:
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
,然后然后将其返回为long long
。您需要在之前将其中一个进行乘法运算,以便将long long
与long long
结果相乘。
还检查 最小 两个数字的乘积,正如 Bishal 建议的那样,因为 -5 * -5 > 4 * 4
【讨论】:
用 long long 数据类型声明向量有帮助!谢谢。 ?以上是关于使用排序方法求解 Maxium Pairwise Product的主要内容,如果未能解决你的问题,请参考以下文章
推荐系统[四]:精排-详解排序算法LTR (Learning to Rank): poitwise, pairwise, listwise相关评价指标,超详细知识指南。
推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwise相关评价指标,超详细知识指南。
learning to rank 算法总结之pairwise