【问题标题】:Hacker rank minimax problem, maximum sum giving wrong negative values黑客等级极小极大问题,最大和给出错误的负值
【发布时间】:2019-11-03 08:36:44
【问题描述】:

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

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

在代码中,首先我要找到向量中的最大和最小元素,用 max 和 min 表示。 minI 和 maxI 是最小值和最大值的索引。

在计算最大和时,我将 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

【问题讨论】:

  • 如果不知道具体的测试用例,这是不可能在这里回答的。一般建议:不要在 hackerrank 等在线代码判断引擎上浪费时间。
  • 您可以将我的代码粘贴到上面给出的链接上,提交代码后,您将能够看到测试用例。
  • 你知道 C++ 中整数的有效值范围是多少吗?这可能会给你一个线索。
  • 我还应该在哪里练习和提高解决问题的能力?
  • 我还应该在哪里练习和提高解决问题的能力?我认为这取决于你作为程序员想要做什么。如果您的主要目标是获得一份程序员的工作,我会说要避开这些网站。他们会教你很多不适合作为软件开发人员工作的不良做法。而是帮助你在 github 上感兴趣的开源项目。另外,至少对我来说,你在这些网站上解决的问题并不能代表我作为一名专业开发人员 22 年来所做的事情,因为我已经获得了代码报酬。..

标签: c++ c++14


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    将正整数相加后的负和几乎总能指出问题:您遇到了溢出。

    这个问题有一个约束:

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

    当您添加四个接近 10^9 的数字时,会溢出一个 32 位整数。因此,您需要切换到更大的数据类型 - uint64_t 将是一个不错的选择。

    注意:问题要求五个元素中恰好四个的最小和最大总和,这意味着需要排除一个元素。如果从五个元素的总数中减去最小的元素,则总和将是最大的;当你减去最大的元素时,总和将是最小的。

    【讨论】:

    • @MohammadHaris 太好了!现在看看你是否可以用一行代码解决它(提示:使用标准 C++ 库,函数min_elementmax_elementaccumulate)。
    • 好吧,我在说,实际上对 C++ 不是很流利,所以对内置函数不太了解。
    • @Alex 完成 :-) :-) :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多