Динамическое программирование на таблицах(46 задач)
Динамическое программирование по подстрокам(21 задач)
Задача о рюкзаке(34 задач)
Рассмотрим произвольную последовательность целых чисел. Между числами можно расставить знаки арифметических операций + или , и таким образом получать некоторые выражения, которые принимают различные значения. Например, если взять последовательность: 17, 5, - 21, 15, то можно получить восемь различных выражений:
Назовем последовательность делящейся на натуральное K, если + и могут быть расставлены так, что итоговое значение выражения будет делиться на K. В приведенном примере последовательность делится на 7 (17 + 5 + - 21 - 15 = - 14), но не делится на 5.
17 |
+ |
5 |
+ |
-21 |
+ |
15 |
= |
16 |
17 |
+ |
5 |
+ |
-21 |
- |
15 |
= |
-14 |
17 |
+ |
5 |
- |
-21 |
+ |
15 |
= |
58 |
17 |
+ |
5 |
- |
-21 |
- |
15 |
= |
28 |
17 |
- |
5 |
+ |
-21 |
+ |
15 |
= |
6 |
17 |
- |
5 |
+ |
-21 |
- |
15 |
= |
-24 |
17 |
- |
5 |
- |
-21 |
+ |
15 |
= |
48 |
17 |
- |
5 |
- |
-21 |
- |
15 |
= |
18 |
Ваша задача — написать программу, определяющую делимость последовательности на целое число.
Первая строка содержит два натуральных числа N и K(1 ≤ N ≤ 10000, 2 ≤ K ≤ 100), разделенные пробелом. Вторая строка состоит из N целых чисел, разделенных пробелами. Все числа не превосходят 10000 по модулю.
Выведите в выходной файл "Divisible", если данная последовательность делится на K или "Not divisible", в противном случае.
4 7 17 5 -21 15
Divisible
4 5 17 5 -21 15
Not divisible
В телеигре "The Price is Right" игроки (обычно четверо) соревнуются в угадывании стоимости того или иного предмета. Побеждает тот, кто назвал наиболее близкое число, не превосходящее ответа. Ввиду популярности телеигры "Кто Хочет Стать Миллионером", в которой участвует один игрок, American Contest Management (ACM) решило выпустить свою версию игры «The Price is Right» для одного игрока. В этой версии каждому участнику даётся G (1 ≤ G ≤ 30) попыток и L (0 ≤ L ≤ 30) жизней. Игроку требуется точно угадать стоимость предмета. Если очередная попытка верна, то игрок выигрывает. В противном случае он теряет попытку. Помимо того, если он называет число, большее ответа, то также теряет одну жизнь. Игрок проигрывает, если у него не остаётся попыток или он называет большую стоимость, не имея ни одной жизни. Все цены положительные целые числа. Оказывается, что для некоторых значений G и L при условии, что искомая стоимость лежит в интервале от 1 до N включительно, можно избрать заведомо выигрышную стратегию. ACM не хочет, чтобы выигрывал каждый участник, поэтому организаторы хотят быть уверены, что настоящая стоимость превосходит N. Но в то же время нельзя делать игру слишком сложной, поскольку в противном случае победителей будет слишком мало, и игра быстро потеряет популярность. Поэтому организаторы хотят подобрать значения G и L в зависимости от искомой стоимости. В связи с этим ACM попросило вас решить следующую задачу: по заданным значениям G и L найти максимальное значение N, при котором игрок может воспользоваться заведомо выигрышной стратегией.
На вход может подаваться сразу несколько тестов. Каждый тест задаётся строкой из двух целых чисел G и L, разделённых пробелом. Признаком конца ввода является строка, содержащая G = L = 0.
Для каждого теста выведите строку в следующем формате: Case c: N, где с — номер теста, а N — ответ на вопрос задачи.
3 0 3 1 10 5 7 7 0 0
Case 1: 3 Case 2: 6 Case 3: 847 Case 4: 127
В головоломку умножения играют с рядом карт, каждая из которых содержит одно положительное целое число. Во время хода игрок убирает одну карту из ряда и получает число очков, равное произведению числа на убранной карте и чисел на картах, лежащих непосредственно слева и справа от неё. Не разрешено убирать первую и последнюю карты ряда. После последнего хода в ряду остаются только эти две карты.
Цель игры — убрать карты в таком порядке, чтобы минимизировать общее количество набранных очков.
Например, если карты содержат числа 10, 1, 50, 20 и 5, игрок может взять карту с числом 1, затем 20 и 50, получая очки 10·1·50 + 50·20·5 + 10·50·5 = 500 + 5000 + 2500 = 8000. Если бы он взял карты в обратном порядке, то есть 50, затем 20, затем 1, количество очков было бы таким: 1·50·20 + 1·20·5 + 10·1·5 = 1000 + 100 + 50 = 1150.
В первой строке файла находится число карт N, во второй — разделённые пробелами N чисел на картах. Ограничения: 3 ≤ N ≤ 100, числа на картах целые от 1 до 100.
Вывести одно целое число — минимально возможное число очков.
6 10 1 50 50 20 5
3650
(Задача отличается от предыдущых исключительно ограничениями.)
Есть сообщение, записанное в алфавите из N символов. Известно, что 1-й, 2-й, ..., N -й символы алфавита использованы в сообщении f 1 , f 2 , ..., f N раз. Его необходимо набрать на M -клавишной клавиатуре, используя способ набора, аналогичный используемому в мобильных телефонах.
На телефоне, клавише 2 сопоставлены буквы abc, клавише 3 — def, и т.д. Для набора текста телефон переводится в специальный режим, в котором одно нажатие на клавишу 2 порождает символ a, 2 подряд нажатия на 2 символ b, 3 подряд символ c; аналогично, одно нажатие 3 порождает d, 2 подряд e и т. д. Если же необходимо набрать 2 подряд буквы a, то нажимают клавишу 2, немного ждут и снова нажимают клавишу 2.
В нашем случае, символы с 1-ого по некоторый K 1 -ый должны соответствовать 1-ой клавише, с ( K 1 + 1) -ого по некоторый K 2 -ой — 2-ой клавише и т. д., до K M = N . Конкретные значения K 1 , K 2 , ..., K M - 1 не задаются — их, наоборот, нужно подобрать.
Напишите программу, которая будет искать минимальное необходимое количество нажатий на клавиши для набора указанного сообщения на указанной клавиатуре.
В первой строке содержатся два числа N и M , во второй — N чисел f 1 , f 2 , ..., f N — количества вхождений соответствующего символа. Числа внутри строк разделены одинарными пробелами. 2 ≤ M ≤ 1500 , 3 ≤ N ≤ 2000 , M < N , 1 ≤ f i ≤ 1000 .
Необходимо вывести единственное число — найденное минимальное количество нажатий на клавиши.
Значение 21 достигается при K 1 = 2 , K 2 = 3 (1-й и 2-й символы сопоставить 1-й клавише, 3-й символ 2-й клавише, 4-й и 5-й символы 3-й клавише). Тогда количество нажатий будет
(3 × 1 + 2 × 2) + (5 × 1) + (7 × 1 + 1 × 2) = 21 .
5 3 3 2 5 7 1
21
(Задача отличается от предыдущых исключительно ограничениями.)
Есть сообщение, записанное в алфавите из N символов. Известно, что 1-й, 2-й, ..., N -й символы алфавита использованы в сообщении f 1 , f 2 , ..., f N раз. Его необходимо набрать на M -клавишной клавиатуре, используя способ набора, аналогичный используемому в мобильных телефонах.
На телефоне, клавише 2 сопоставлены буквы abc, клавише 3 — def, и т.д. Для набора текста телефон переводится в специальный режим, в котором одно нажатие на клавишу 2 порождает символ a, 2 подряд нажатия на 2 символ b, 3 подряд символ c; аналогично, одно нажатие 3 порождает d, 2 подряд e и т. д. Если же необходимо набрать 2 подряд буквы a, то нажимают клавишу 2, немного ждут и снова нажимают клавишу 2.
В нашем случае, символы с 1-ого по некоторый K 1 -ый должны соответствовать 1-ой клавише, с ( K 1 + 1) -ого по некоторый K 2 -ой — 2-ой клавише и т. д., до K M = N . Конкретные значения K 1 , K 2 , ..., K M - 1 не задаются — их, наоборот, нужно подобрать.
Напишите программу, которая будет искать минимальное необходимое количество нажатий на клавиши для набора указанного сообщения на указанной клавиатуре.
В первой строке содержатся два числа N и M , во второй — N чисел f 1 , f 2 , ..., f N — количества вхождений соответствующего символа. Числа внутри строк разделены одинарными пробелами. 2 ≤ M ≤ 1500 , 3 ≤ N ≤ 2000 , M < N , 1 ≤ f i ≤ 1000 .
Необходимо вывести единственное число — найденное минимальное количество нажатий на клавиши.
Значение 21 достигается при K 1 = 2 , K 2 = 3 (1-й и 2-й символы сопоставить 1-й клавише, 3-й символ 2-й клавише, 4-й и 5-й символы 3-й клавише). Тогда количество нажатий будет
(3 × 1 + 2 × 2) + (5 × 1) + (7 × 1 + 1 × 2) = 21 .
5 3 3 2 5 7 1
21