ранг хакера Mini-Max Sum - PullRequest
       26

ранг хакера Mini-Max Sum

2 голосов
/ 11 июля 2020

эта проблема

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

Имейте в виду, что я пробовал разные размеры ввода, такие как float, long long int, int и double;

#include <bits/stdc++.h>

using namespace std;

int main() {
    long long int arr[5], neglect = 0, min = 9999999999999, max = 0, curr = 0; 
    for (int i = 0; i < 5; i++) {
        cin >> arr[i];
    }

    while (neglect < 5) {
        for (int i = 0; i < 5; i++) {
            if (i == neglect) {i++;}
            curr += arr[i];
        }
        if (curr < min) {min = curr;}
        if (curr > max) {max = curr;}
        //cout << curr << endl;
        //cout << curr << " " << min << " " << max << endl;
        curr = 0;
        neglect++;
    }
    cout << min << " " << max;
}

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

input: 1 2 3 4 5 заявленный результат: 11 4198826

, но когда я отладил его с тем же пользовательским вводом и прокомментированными строками, он показал:

14 14 14
13 13 14
12 12 14
11 11 14
10 10 14
10 14

Разве это не означает, что мой код должен работать?

1 Ответ

2 голосов
/ 11 июля 2020

Когда вы пренебрегаете последним элементом, вы выполняете i++, и это добавит arr[5] к значению curr, но arr[5] выходит за пределы массива, поэтому он может дать segfault или неожиданный результат.

Я бы посоветовал вам не увеличивать i в for l oop, вместо этого вы можете использовать continue, если хотите пренебречь элементом.

        for (int i = 0; i < 5; i++) {
            if (i == neglect) {
                continue;
            }
            curr += arr[i];
        }

Кроме того, вы можете заменить внешний для l oop на while l oop, чтобы не увеличивать значение пренебрежения вручную.

...