Задача минимаксного ранга хакера, максимальная сумма дает неправильные отрицательные значения

В настоящее время я решаю эту проблему на Hackerrank: https://www.hackerrank.com/challenges/mini-max-sum/problem

Я прошел только 5 из 15 тестов. Проблема в выводе максимальной суммы.

В коде сначала я нахожу максимальный и минимальный элемент в векторе, обозначаемый 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


person Mohammad Haris    schedule 20.06.2019    source источник
comment
Не зная конкретных тестов, здесь невозможно ответить. В качестве общего совета: не тратьте свое время на онлайн-системы оценки кода, такие как hackerrank.   -  person πάντα ῥεῖ    schedule 20.06.2019
comment
Вы можете вставить мой код по приведенной выше ссылке, и после отправки кода вы сможете увидеть тестовые примеры.   -  person Mohammad Haris    schedule 20.06.2019
comment
Знаете ли вы, каков диапазон допустимых значений для целого числа в C++? Это может дать вам подсказку.   -  person anonmess    schedule 20.06.2019
comment
Где еще я могу попрактиковаться и улучшить свои навыки решения проблем?   -  person Mohammad Haris    schedule 20.06.2019
comment
Где еще я могу попрактиковаться и улучшить свои навыки решения проблем? Я думаю, это зависит от того, чем вы хотите заниматься как программист. Если ваша главная цель — устроиться на работу программистом, я бы посоветовал избегать этих сайтов. Они научат вас многим плохим практикам, которые не очень совместимы с работой разработчика программного обеспечения. Вместо этого помогите интересующему вас проекту с открытым исходным кодом на github. Также, по крайней мере, для меня проблемы, которые вы решаете на этих сайтах, не очень репрезентативны для того, что я сделал как профессиональный разработчик за свои 22 года, когда мне платили за код.   -  person drescherjm    schedule 20.06.2019
comment
@πάνταῥεῖ Чувак, не нужно, те, кто действительно заинтересован в том, чтобы помочь мне решить мою проблему, которая была такой глупой.   -  person Mohammad Haris    schedule 20.06.2019
comment
@drescherjm, я просто хочу улучшить свои навыки решения проблем. В будущем планирую заняться AI/ML.   -  person Mohammad Haris    schedule 20.06.2019
comment
Не связанный с проблемой. Но вы можете решить эту проблему всего за одну итерацию по вектору, см. этот пример   -  person Neijwiert    schedule 20.06.2019
comment
@ πάνταῥεῖ Да, плохо, но это помогло мне решить проблему, я, вероятно, удалю этот вопрос.   -  person Mohammad Haris    schedule 20.06.2019
comment
@MohammadHaris Возможно, я удалю этот вопрос. Хорошая идея!   -  person πάντα ῥεῖ    schedule 20.06.2019
comment
@Neijwiert Вау, это довольно круто. Я знаю, что мой код был плохим с точки зрения сложности и беглости   -  person Mohammad Haris    schedule 20.06.2019
comment
@πάνταῥεῖ Я не соглашусь с вами, эти веб-сайты помогут вам написать эффективное, менее своевременное и крупномасштабное решение. это похоже на то, что мы можем складывать числа от 0 до 10 ^ 9 одно за другим или просто использовать формулу   -  person sahasrara62    schedule 21.06.2019
comment
@MohammadHaris это простая проблема, все, что вам нужно сделать, это отсортировать данные и получить сумму первых 4 и последних 4 элементов.   -  person sahasrara62    schedule 21.06.2019


Ответы (2)


Судя по всему, на этой платформе int имеет длину 32 бита, что означает диапазон от -2147483647 до 2137483647. Превышение максимального значения — Undefined Behaviour.

Кажется, что для представленного вами тестового примера будет достаточно изменить int на long long, но возможно, что задача потребует еще больших чисел, и вам нужно будет решить, как выполнять вычисления на больших числах.

person Yksisarvinen    schedule 20.06.2019

Отрицательные суммы после добавления положительных целых чисел почти всегда указывают на проблему: вы получаете переполнение.

Эта задача имеет ограничение:

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

Когда вы складываете четыре числа, близких к 10^9, вы переполняете 32-битное целое число. Следовательно, вам нужно переключиться на более крупный тип данных — uint64_t будет хорошим кандидатом.

Примечание. В задаче требуется минимальная и максимальная сумма ровно четырех из пяти элементов, а это означает, что нужно исключить ровно один элемент. Отсюда следует, что сумма будет максимальной, если вычесть наименьший элемент из суммы пяти элементов; когда вы вычитаете самый большой элемент, сумма будет минимальной.

person Sergey Kalinichenko    schedule 20.06.2019
comment
@MohammadHaris Это здорово! Теперь посмотрите, сможете ли вы решить ее с помощью одной строки кода (подсказка: используйте стандартную библиотеку C++, функции min_element, max_element и accumulate). - person Sergey Kalinichenko; 20.06.2019
comment
Хорошо, я занимаюсь этим, на самом деле я не очень хорошо разбираюсь в C++, поэтому не знаю многих встроенных функций. - person Mohammad Haris; 20.06.2019
comment
@ Алекс Готово :-) :-) :-) - person Sergey Kalinichenko; 29.06.2019