Мне нужен оптимальный способ перебора массива

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

Во время недавнего конкурса я столкнулся с таким вопросом: https://atcoder.jp/contests/abc334/tasks/abc334_c

Теперь логика, которую я использовал для решения этого вопроса

Эту задачу можно рассматривать как задачу, в которой требуется составить пары $\left\lfloor\frac{K}{2}\right\rfloor$ из одного носка каждого цвета $A_1, A_2, \ldots, A_K$. Если $K$ четное, кажется оптимальным спаривание $\left(A_1, A_2\right),\left(A_3, A_4\right), \ldots,\left(A_{K-1}, A_K\right) $, так что соседние цвета (в отсортированной последовательности) образуют пары, что действительно так.

Проблема в том, что $K$ нечетно. В этом случае мы можем перебрать единственный цвет, который не является парным, где можно найти оптимальный способ создания пар из других носков, как мы это делали для четного $K$. Когда фиксирован единственный цвет, который не спарен, минимальная общая странность, когда остальные носки спарены, наивно находится за время $O(N)$, но в результате получается $O\left(N^2\right )$ сложность. Вместо этого можно заранее рассчитать общую странность, когда первые несколько носков спарены, например, presum $[2]=\left(A_2-A_1\right), \operatorname{presum}[4]=\left(A_4-\right .$ $\left.A_3\right)+\left(A_2-A_1\right)$, предполагается $[6]=\left(A_6-A_5\right)+\left(A_4-A_3\right)+\left (A_2-A_1\right), \ldots$, в виде префиксной суммы; можно также найти «суффиксную сумму». Таким образом, задачу можно решить всего за $O(N)$ времени.

Когда мы используем этот подход и пытаемся решить вопрос, мы получаем ошибку TLE из-за временных ограничений задач. При проверке редакционной статьи единственный способ избавиться от этого TLE — использовать эту оптимизацию:

Когда $K$ нечетное значение, вместо грубого перебора всех носков, которые не являются в паре можно попробовать только $A_1, A_3, A_5, \ldots, A_K$ . В следующем примере кода мы используем этот метод для упрощения выполнение.

Я не могу понять, почему не стоит пробовать A2, A4 и все остальные, даже индексированные элементы? Может кто-нибудь помочь мне или хотя бы намекнуть на логику этой оптимизации. Спасибо

Редактировать: я не могу починить здесь свой латекс, может ли кто-нибудь помочь и с этим. Я добавил изображение алгоритма, который использовал. И все, что я пытаюсь объяснить с помощью латекса.

Добро пожаловать в ТАК! Что именно вы пробовали до сих пор? Мы здесь гораздо больше, чтобы помочь с конкретными вопросами типа «Я попробовал X, но он не дал того, что я ожидал, и вместо этого привел к ошибке!» сопровождается Минимальным, полным и проверяемым примером

ti7 11.05.2024 10:08

SO не поддерживает LaTeX, как это делают некоторые другие сайты - визуализируйте его и просто добавляйте изображения (другой пользователь может вставлять изображения из ссылок, если у вас недостаточно репутации, чтобы сделать это напрямую)

ti7 11.05.2024 10:09

«Я наткнулся на этот вопрос [ссылка]»: хотя ссылки на другие сайты могут быть полезны для получения справочной информации, вся важная информация должна быть включена в вопрос. Пожалуйста, процитируйте описание проблемы с кодом.

trincot 11.05.2024 10:12

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

Simon Goater 11.05.2024 13:40

На каком языке вы отправили заявку? Описанный вами алгоритм легко переходит на C++.

Unmitigated 11.05.2024 19:24

@SimonGoater Тот факт, что даже индексы можно игнорировать, даже близко не является ключевой частью решения; он использовался только для упрощения реализации. Можно легко пройти, просто проверив все индексы.

Unmitigated 11.05.2024 19:38
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

a x b

Если вы пропустите x, вам придется соединить a и b, а стоимость составит b-a. Если вместо этого вы опустите a или b, вы всегда получите лучший результат с затратами x-a или b-x.

... так что вам никогда не придется отказываться от носков с четными номерами.

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

Другие вопросы по теме