Разбор ДВГУПС — тренировка 28

Revision ru6, by nikich340, 2017-08-13 15:34:54

А. Ярмарка оружия [реализация, математика]

Следовало последовательно сравнить силы наборов, если текущая сила строго больше максимальной предыдущей, то обновляем максимальную и индекс лучшего набора. Вычислить силу набора можно было в нецелых числах как (сумма si, j / wi), или сохранить числитель и знаменатель дроби (sumsmax и wmax) и сравнивая с текущим набором домножить обе части на (wmax·wi). Не стоит забывать, что суммирование 105 чисел до 109 приведёт к переполнению типа integer.

Код в нецелых числах: O(n)

B. Имённо-фамильный никнейм [перебор, строки]

Любое решение сводится к тому, чтобы максимизировать подстроку в n (ведь чем больше символов мы возьмём из n, тем меньше потребуется из f).

Обозначим длину такой подстроки за k.

1) Наивное решение может проверять все подстроки строки n для поиска максимального k, после чего искать недостающий конец строки в f. Это будет работать за O(q * |n|2 + q * |f|) в теории, однако лишь в худшем частном случае, когда множество раз наблюдается значительное совпадение подстроки с первой часть строки si (пример: n = " ", f = " ", и все si = " ").

Код

2) Подсчитать все возможные подстроки для n за |n|2, сложить в set или бор, или подсчитать хеши (это будет работать аналогично set). Теперь для каждого si можно последовательно искать k, после чего можно пройтись последовательно по f, узнав, есть ли там оставшиеся |si| - k символов. При использовании set или хешей можно также искать k бинарным поиском, укорачивая или удлиняя текущую строку до длины M на каждой итерации и ища ей соответствие в подстроках n. Асимптотики такого решения: \begin{itemize} \item {Для хешей или set: \begin{enumerate} \item если искать k последовательно: O(q * k * log2(|n|2) + q * |f|) \item бинарным поиском: O(q * log2(k) * log2(|n|2) + q * |f|) \end{enumerate} } \item Для бора: O(q * k + q * |f|) \end{itemize}

Код с set, последовательное $k$

Код с set, бинарный поиск по $k$

Код с бором

2) Развернём n, f, и si задом наперёд. Тогда нам нужно максимизировать не подстроку, а подпоследовательность в f, в этом единственное отличие от предыдущего варианта. Искать k для подпоследовательности можно только последовательно, после чего нам нужно найти в n подстроку длины |n| - k, для чего опять же следует предподсчитать все возможные подстроки для n за |n|2 и сложить их в какую-нибудь структуру. Асимптотика решения: \begin{itemize} \item Для хеша или set: O(q * k + q * log2(|n|2)) \item Для бора: O(q * k + q * |n|) \end{itemize}

Tags разбор, двгупс, тренировка

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru23 Russian nikich340 2017-08-15 02:06:12 57
ru22 Russian nikich340 2017-08-14 03:38:53 0 (опубликовано)
ru21 Russian nikich340 2017-08-14 03:37:24 0
ru20 Russian nikich340 2017-08-14 03:37:24 6
ru19 Russian nikich340 2017-08-14 03:35:31 879 Мелкая правка: 'няется $x^cnt[x] % m$. Сде' -> 'няется $x^{cnt[x]} % m$. Сде'
ru18 Russian nikich340 2017-08-14 03:21:52 1685
ru17 Russian nikich340 2017-08-14 02:55:25 337 Мелкая правка: '(b + 1)$\n$\frac{f' -> '(b + 1)$\n\n$\frac{f'
ru16 Russian nikich340 2017-08-14 02:47:51 294
ru15 Russian nikich340 2017-08-14 02:43:54 387
ru14 Russian nikich340 2017-08-14 02:38:00 2110
ru13 Russian nikich340 2017-08-14 02:19:17 112
ru12 Russian nikich340 2017-08-14 02:17:37 2 Мелкая правка: 'руктуру.\nАсимптот' -> 'руктуру.\n\nАсимптот'
ru11 Russian nikich340 2017-08-14 02:16:48 72 Мелкая правка: 'решения:\n- Для хе' -> 'решения:\n\n- Для хе'
ru10 Russian nikich340 2017-08-14 02:14:24 189
ru9 Russian nikich340 2017-08-13 15:40:50 4
ru8 Russian nikich340 2017-08-13 15:39:04 139
ru7 Russian nikich340 2017-08-13 15:35:40 15
ru6 Russian nikich340 2017-08-13 15:34:54 10
ru5 Russian nikich340 2017-08-13 15:33:54 427
ru4 Russian nikich340 2017-08-13 15:20:03 2245 Мелкая правка: 'ематика]\nСледовал' -> 'ематика]\n\nСледовал'
ru3 Russian nikich340 2017-08-13 15:15:48 16
ru2 Russian nikich340 2017-08-13 15:15:20 616
ru1 Russian nikich340 2017-08-13 14:57:12 113 Первая редакция (сохранено в черновиках)