黑客排名最小最大值问题,最大总和给出错误的负值

Hacker rank minimax problem, maximum sum giving wrong negative values

本文关键字:出错 错误 最大值 问题 黑客      更新时间:2023-10-16

我目前正在Hackerrank上解决这个问题: https://www.hackerrank.com/challenges/mini-max-sum/problem

在 15 个测试用例中,我只通过了 5 个。问题出在最大总和的输出上。

在代码中,首先我找到向量中的最大值和最小值,用最大值和最小值表示。

在计算最大总和时,我输入 arr[minI] = 0(因此向量被简化为将给出最大总和的元素)。获得最大和后,我输入 arr[minI] = min,从而恢复原始向量。然后我重复这个过程,把 arr[maxI] = 0;通过这种方式,可以同时获得n-1元素的最小和最大和。我知道这很难理解,但任何人都可以帮我找出这里的问题。

我尝试使用 arr.erase() 和 arr.insert(),但这让我遇到了索引问题。

void miniMaxSum(vector<int> arr) {
int max = arr[0];
int min = arr[0];
int minI = 0;
int maxI = 0;
for (int i = 0; i < arr.size(); i++) {
if(arr[i] > max){
max = arr[i];
maxI = i;
}
if(arr[i] < min){
min = arr[i];
minI = i;
}
}

arr[minI] = 0;
int maxsum = 0;
for(int i = 0; i<arr.size(); i++){
maxsum += arr[i];
}
arr[minI] = min;

arr[maxI] = 0;
int minsum = 0;
for(int i = 0; i<arr.size(); i++){
minsum += arr[i];
}

cout << minsum << " " << maxsum;
}

例如,一个测试用例的输入是:

140537896 243908675 670291834 923018467 520718469

上述输入的正确答案是: 1575456874 2357937445

我对上述输入的回答是: 1575456874 -1937029851

显然,在这个平台上,int的长度为 32 位,这意味着它的范围在-21474836472137483647之间 .溢出最大值是"未定义的行为"。

似乎对于您提出的测试用例,将int更改为long long就足够了,但是该问题可能需要更大的数字,并且您需要弄清楚如何对更大的数字执行计算。

添加正整数后的负和几乎总是能指出问题所在:你得到了溢出。

此问题有一个约束:

1 <= arr[i] <= 10^9

将四个接近 10^9 的数字相加时,会溢出 32 位整数。因此,您需要切换到更大的数据类型 -uint64_t将是一个很好的候选者。

注意:该问题要求五个元素中的四个元素的最小和最大和,这意味着只需要排除一个元素。因此,如果从五个元素的总和中减去最小的元素,则总和将是最大值;当您减去最大的元素时,总和将是最小的。

相关文章: