Алгоритм:
Позвольте мне представить некоторые переменные:
k_digits
- количество цифр в K
.
Прежде всего, мы можем заметить, что наш итоговый номер будет иметь k_digits
или k_digits + 1
. Если еще не ясно, я объясню это более подробно в конце.
Начнем с предположения, что в ответе будут цифры k_digit
.
Мы можем разделить нашу основную проблему на несколько меньших (а затем получить ответ на исходную проблему, объединив решения с подзадачами). Заявление подзадачи будет звучать следующим образом:
- Какое наименьшее число больше, чем
K
БЕЗ последней цифры.
- Можем ли мы составить число
K
без последней цифры из цифр, которые нам разрешено использовать?
Предположим, у нас есть решение этой проблемы. Тогда нам нужно найти ответ на начальную задачу. Мы можем сделать это следующим образом:
a) Если ответ на подзадачу 2 верен (мы можем составить без последней цифры). Затем мы должны попытаться добавить наименьшую доступную цифру из набора в конец этого номера, чтобы она была больше K
. Что мы на самом деле делаем - мы пытаемся заменить последнюю цифру начального K
на большую цифру от allowed set
. Назовем это новый номерanswer1
.
b) Добавить наименьший доступный номер из набора в конец номера из первой подзадачи. Это число будет больше, чем K
, поскольку его префикс больше. Назовем это число answer2
.
с) На заключительном этапе мы должны сравнить answer1
(если она существует) и answer2
, и выбрать наименьшее. Это будет ответ на первоначальный вопрос.
Ну, теперь я надеюсь, что ясно, как мы комбинируем ответ из подзадач. Итак, теперь я объясню, как найти решение подзадач.
Начнем с второй подзадачи. Это легко - мы просто проверяем, есть ли у нас в наших allowed set
все цифры номера K
(без последнего).
Теперь первая подзадача. Вы можете заметить, что эта подзадача равна начальной задаче, но с меньшим K
. Таким образом, мы можем решить эту проблему «рекурсивно». В базовом случае здесь будет однозначный K
. Мы можем сказать ответ напрямую, когда у нас есть только одна цифра - просто для поиска нашего набора для цифры, большей цифры K
.
Также обратите внимание, что в какой-то момент у нас может не быть ответа на подзадачу 1. Это означает, что мы не можем составить число длины k_digits
, которое больше K
. Но в этом случае мы всегда можем составить число с k_digits + 1
. Просто выберите наименьшую цифру из разрешенного набора (k_digits + 1)
раз. Специальный чехол: нули.
Пример:
allowed_set=[4,5]
K = 435
Мы можем видеть, что мы можем плюнуть нашу исходную задачу к подзадачи, где K = 43
. Решение второй подзадачи будет false
, так как нам не разрешено использовать цифру 3
. Решение первой подзадачи мы попытаемся найти следующим образом - снова разбивая ее на две подзадачи, где K = 4
. В этом случае ответ на первую подзадачу будет 5
, а второй подзадаче будет 4
. Мы можем составить ответ на случай K = 43
следующим образом: answer1 = 44
, answer2 = 54
. answer1
меньше, поэтому на самом деле это ответ на случай, когда K = 43
. Затем, чтобы найти ответ для K = 435
, мы можем добавить 4
в конец 44
. Итак, ответ 444
.
Это может быть не лучший пример, но я надеюсь, что это иллюстрирует мой ответ. Спросите, есть ли у вас дополнительные комментарии.
Это мой первый вопрос о StackOverflow.Я был бы очень благодарен, если бы люди, которые опросили этот вопрос, также сказали мне причину. – Nirmal
Всегда старайтесь предоставить то, что вы уже пробовали. Мы здесь, чтобы помочь вам решить ошибки, мы не здесь, чтобы написать код для вас. Посмотрите [здесь] (http://stackoverflow.com/help/how-to-ask), чтобы узнать, как вы могли бы улучшить свой вопрос. Редактировать: также попробуйте повторить то, что вы хотите в своем вопросе, и не только в названии. Будьте предельно ясны. – Jordumus