K-тий Гутаб#11460

K-тий Гутаб (Розбір)

Додамо в множину число . Потім виконаємо кроків:

Після виконання кроків найменший елемент множини буде дорівнювати -й найменшій ціні, яку може заплатити Хусейн.

Реалізація алгоритму

Читаємо вхідні дані.

scanf("%d %d", &n, &k);
for (i = 0; i < n; i++)
  scanf("%d", &m[i]);

Додаємо в множину число .

s.insert(0);

Здійснюємо ітерацій.

for (i = 0; i < k; i++)
{

Витягуємо та видаляємо найменший елемент .

  x = *s.begin(); s.erase(x);

Для кожного i~(1 \le i \le n) додаємо до множини елемент x + a_i.

  for (j = 0; j < n; j++)
    s.insert(x + m[j]);
}

Виводимо відповідь: -ту найменшу ціну, яка дорівнює найменшому елементу множини.

printf("%lld\n", *s.begin());

Python реалізація — TLE

Функція min() працює за , оскільки проходить по всіх елементах множини, щоб знайти найменший.

У Python множини є невпорядкованими колекціями, тому min() не може скористатися якоюсь внутрішньою впорядкованістю або структурою. Натомість вона перевіряє кожен елемент окремо, щоб визначити мінімум, що призводить до лінійної часової складності, пропорційної кількості елементів у множині.

n, k = map(int, input().split())
m = list(map(int, input().split()))

s = set({0})

for _ in range(k):
  x = min(s)
  s.remove(x)
  for value in m:
    s.add(x + value)

print(min(s))

Python реалізація

SortedSet підтримує елементи у відсортованому порядку, використовуючи внутрішній відсортований список.

Доступ до елемента по індексу (наприклад, для найменшого елемента) виконується за константний час, оскільки SortedSet безпосередньо витягує елемент за вказаним індексом без додаткових обчислень.

Операція add() у SortedSet з бібліотеки sortedcontainers виконується за час O(log n), де — кількість елементів у множині.

from sortedcontainers import SortedSet

n, k = map(int, input().split())
m = list(map(int, input().split()))

s = SortedSet([0])

for _ in range(k):
  x = s[0]
  s.discard(x)
  for value in m:
    s.add(x + value)

print(s[0])