for(auto it = arr.rbegin(); it != arr.rend();it++){
int val = *it;
auto idx = std::upper_bound(S.begin(), S.end(), val);
if (idx != S.end()) {
ops++;
S.erase(idx);
} else {
S.insert(std::lower_bound(S.begin(), S.end(), val), val);
}
}
Это работает для небольших примеров, но я не уверен, что это достаточно эффективно для больших N. Я также читал, что лучше использовать multiset. В настоящее время я получаю 5/100 с помощью этого решения. Вопрос:
Является ли этот подход правильным и эффективным?
Как лучше всего реализовать это на C++ для обработки N до 20 000 и M до 1000?
Я пытаюсь решить задачу, в которой робот укладывает контейнеры на складе, и хочу посчитать количество операций, которые он выполняет. Правила: [list] [*]Существует N контейнеров, расположенных в один ряд.
[*]Каждый контейнер имеет размер Ai (1 ≤ Ai ≤ M).
[*]Робот может выбрать контейнер и поместить его [b]внутри большего контейнера справа от него[/b].
[*]Контейнер, который уже содержит другой, нельзя использовать повторно.
[*]Мне нужно посчитать общее количество операций робота (вложений).
[/list] [b]Ввод:[/b] [list] [*]Первая строка: два целых числа M (максимальный размер контейнера) и N (количество контейнеры).
[*]Вторая строка: N целых чисел A1, A2, ..., AN, обозначающих размеры контейнеров по порядку.
[/list] [b]Вывод:[/b] [list] [*]Одно целое число: количество выполненных операций робота. [/list] [b]Пример ввода:[/b] [code]5 10 2 2 1 4 3 2 5 4 2 3 [/code] [b]Пример вывода:[/b] [code]4 [/code] [b]Объяснение:[/b] [list] [*]Робот вкладывает контейнеры в первый доступный контейнер большего размера справа от него.
[*]После выполнения 4 вложений больше контейнеров вкладывать невозможно.
[/list] [b]Что я сделал Пробовал:[/b] Я пробовал использовать вектор с Upper_bound и Lower_bound в обратном порядке: [code]for(auto it = arr.rbegin(); it != arr.rend();it++){ int val = *it; auto idx = std::upper_bound(S.begin(), S.end(), val); if (idx != S.end()) { ops++; S.erase(idx); } else { S.insert(std::lower_bound(S.begin(), S.end(), val), val); } } [/code] Это работает для небольших примеров, но я не уверен, что это достаточно эффективно для больших N. Я также читал, что лучше использовать multiset. В настоящее время я получаю 5/100 с помощью этого решения. [b]Вопрос:[/b] [list] [*]Является ли этот подход правильным и эффективным?
[*]Как лучше всего реализовать это на C++ для обработки N до 20 000 и M до 1000?