Не можете понять проблему с итератором? - PullRequest
0 голосов
/ 20 июня 2019

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

Проблема связана с вводом:

3 4 3 9 1 1 9 8 9

с m: для прохождения отметки требуется 14

Здесь при шестом индексе ввода, который равен 9, который не был добавлен в мультимножество, каким-то образом удаляется.

Вывод, который я получаю при запуске проблемного ввода:

0 0 0 ;4--;3-- 2 ;9-- 1 ;9-- 1 ;9--;4--;9-- 3 ;9--;9--;9-- 3 ;9--;9--;9--;9-- 4

Значения в: "" - содержат * x, который вычитается из суммы, есть дополнительные 9, но я незнаете как?

multiset<int> st;
    int setsum =0;
    for(int i=0;i<n;i++)
    {
        int sum = setsum+ar[i];
        if((sum)<=m)
        {
            cout<<"0 ";
        }
        else
        {
            //cout<<sum<<"-*";
            int cnt = 0;
            auto x = st.rbegin();
            while(sum>m)
            {
                sum -= *x;
                //cout<<";"<<*x<<"--";
                x--;
                //if(i==3)
                    //cout<<*x<<"++";
                cnt++;
            }
            cout<<" "<<cnt<<" ";
        }
        st.emplace(ar[i]);
        setsum += ar[i];
    }

1 Ответ

1 голос
/ 20 июня 2019

Вероятно, это не единственные проблемы, но я не могу не заметить две основные ошибки при использовании обратных итераторов:

  1. Вы уменьшаете значение итератора (--x) вместо его увеличения (++x);весь смысл обратных итераторов состоит в том, что направление меняется на обратное, поэтому вы должны увеличивать итератор для перемещения назад через st.Единственная причина, по которой вы будете использовать --x, заключается в том, что у вас есть двунаправленный итератор, и вы хотите перейти в противоположный «естественный» порядок итераций (поэтому прямые итераторы будут работать назад, а обратные итераторы будут работать вперед).
  2. Выникогда не проверяйте, достиг ли вы конца st;если вы бежите от конца st до sum > m (у нас нет определения m, и, следовательно, нет способа определить, является ли это условие обязательным перед выполнением до конца st), вы нажметенеопределенное поведение.Самое простое решение - просто обновить тест до while (sum > m && x != st.rend()), хотя это может повлиять на вашу логику кода в дальнейшем (поскольку выход из цикла не гарантирует, что sum меньше или равен m), что требуетдальнейшие испытания.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...