Проблема С Решением - Быстрее Находите Восходящие Списки

  • Автор темы Alvigu1
  • Обновлено
  • 22, Oct 2024
  • #1

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

Вот еще раз задача:

А запустить восходящий список — это список, длина серий последовательных одинаковых элементов которого строго увеличивается.

В этом задании вам будет предоставлен список \$n\$ положительных целых чисел, \$x_i\$, в качестве входных данных. Ваша задача — определить, можно ли составить восходящий список из чисел от \$1\$ до \$n\$, в котором каждое число \$k\$ будет встречаться. точно \$x_k\$ раз.

Правила

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

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

Размер входного списка \$x_i\$ будет считаться \$\sum_{n=0}^i 8+\lfloor\log_2(x_i)\rfloor\$ бит. Хотя для удобства вам разрешено использовать форматы, которые не имеют такого точного использования памяти.

Алгоритм перебора имеет сложность \$O(2^n!)\$.

Тай-брейк будет .

Тестовые случаи

Входные данные, которые не могут составить список по возрастанию

 
 [1], [1]
[10], [1,1,1,1,1,1,1,1,1,1]
[6,7], [1,1,1,1,1,1,2,2,2,2,2,2,2]
[7,6], [2,2,2,2,2,2,1,1,1,1,1,1,1]
[4,4,2], [1,3,3,1,1,1,2,2,2,2]
[4,4,7], [1,3,3,1,1,1,2,2,2,2,3,3,3,3,3]
[4,4,8], [1,3,3,1,1,1,2,2,2,2,3,3,3,3,3,3]
 

Входные данные, которые могут сделать восходящий список потенциальных решений, даются после , for clarity but is not necessary for you to compute.

[2,2] [40,40] [40,40,1] [4,4,3] [3,3,20] [3,3,3,3]

#код-гольф #задача принятия решения #комбинаторика #самый быстрый алгоритм

Alvigu1


Рег
29 Nov, 2019

Тем
91

Постов
207

Баллов
692
  • 26, Oct 2024
  • #2

Python, я не уверен в точной сложности. Вероятно, экспоненциально в худшем случае.

 import itertools

bad = set()

def run_ascending(sizes, low=1, prev=0):

if not any(sizes):

return True

if any(0 < x < low for x in sizes):

return False

key = (low, prev) + tuple(sorted(n for n in sizes if n))

if key in bad:

return False

for i, s in enumerate(sizes):

if not s:

continue

if s == prev:

prev = 0

continue

s = sizes[i]

for k in itertools.chain((s,), range(low, (s + 1) // 2)):

sizes[i] -= k

r = run_ascending(sizes, k + 1, sizes[i])

sizes[i] += k

if r:

return True

bad.add(key)

return False
 
 

Kot1073


Рег
03 Oct, 2009

Тем
78

Постов
203

Баллов
623
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно