Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | bubbles.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | bubbles.out |
Сережа — большой любитель игр на сотовом телефоне. Недавно он скачал из интернета новую игру "Пузырьки 1D". Опишем правила игры.
Исходная позиция в игре представляет собой n пузырьков, расположенных вертикально в ряд. Каждый пузырек окрашен в один из четырех цветов — красный, зеленый, синий или желтый. Назовем группой несколько следующих подряд пузырьков одинакового цвета, непосредственно сверху и снизу от которых находятся либо пузырьки другого цвета, либо границы ряда пузырьков.
За один ход разрешается выбрать любую группу, состоящую хотя бы из двух пузырьков, и взорвать ее. За взрыв группы, содержащей k пузырьков, игрок получает k2 очков. После взрыва группы пузырьки, которые находились сверху, опускаются вниз.
Например, ниже на рисунке показана позиция, содержащая 10 пузырьков. В ней четыре группы, содержащие 3, 2, 4 и 1 пузырек, соответственно. Если взорвать группу, содержащую четыре пузырь- ка, то игрок получит 16 очков, и верхние 5 пузырьков опустятся вниз. В получившейся позиции 6 пузырьков, и две группы по 3 пузырька в каждой.
По заданной начальной позиции в игре выясните, сможет ли Сережа уничтожить все пузырьки, и если да, то какое максимальное количество очков он сможет заработать.
Входной файл содержит одну строку, состоящую из букв "R", "G", "B" и "Y", описывающую начальную позицию. Буквы задают цвета пузырьков в порядке просмотра сверху вниз ("R" означает красный пузырек, "G" — зеленый, "B" — синий, а "Y" — желтый).
Выведите в выходной файл одно число — максимальное количество очков, которое сможет заработать Сережа. Если уничтожить все пузырьки невозможно, выведите 0.
В первом примере следует действовать следующим образом: сначала надо взорвать группу из четырех красных пузырьков, получив 16 очков. Затем надо взорвать в любом порядке получившиеся две группы по 3 пузырька, получив по 9 очков за каждую.
В заданной позиции не менее двух и не более 100 пузырьков.
№ | Входной файл (bubbles.in ) |
Выходной файл (bubbles.out ) |
---|---|---|
1 |
|
|
2 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | cage.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | cage.out |
Андрюше на день рождения подарили хомячка. Пока Андрюша не купил для него клетку, он решил сделать ему клетку из подручных средств. Для изготовления клетки он решил использовать набор кубиков, подаренный ему на прошлый день рождения. Однако, неожиданно выяснилось, что сестра Андрюши склеила кубики суперклеем, и отделить их друг от друга не представляется возможным.
Все кубики оказались склеены в две фигуры. Любые два кубика в каждой из фигур либо не имеют общих точек, либо имеют общую грань, либо имеют общее ребро, но в последнем случае есть кубик, с которым каждый из них имеет общую грань. Каждую фигуру можно положить на стол так, что каждый кубик будет касаться стола одной из своих граней.
Теперь Андрюша хочет положить эти две фигуры на стол так, чтобы получилась клетка для хомячка. Фигуры должны быть положены таким образом, чтобы каждый кубик касался стола гранью. Стороны нижних граней кубиков должны быть параллельны сторонам стола. Любые два кубика, принадлежащие различным фигурам, должны либо не касаться друг друга, либо иметь общую грань, либо иметь общее ребро. Фигуры разрешается поворачивать и переворачивать.
Положив фигуры, Андрюша собирается выпустить хомячка на стол. Чтобы он не упал со стола, у него не должно быть возможности добраться от точки, в которую Андрюша его выпустит, до края стола. Хомячок не может перелезать через кубики, и, в частности, не может пролезть между двумя кубиками, имеющими общее ребро. Стол существенно больше каждой из фигур.
Андрюша хочет, чтобы площадь, по которой может бегать хомячок, была как можно больше. Помогите ему выяснить, какая максимальная площадь может быть у территории, до которой сможет добраться хомячок. Площадь грани кубика будем считать равной единице.
Например, две фигуры, показанные на рисунке выше, можно расположить как показано на следующем рисунке. Если выпустить хомячка в точку, отмеченную стрелкой, то доступная ему территория будет иметь площадь равную четырем.
Первая строка входного файла содержит два числа: h1 и w1. Следующие h1 строк содержат по w1 символов и описывают первую фигуру, вид сверху. Каждый из этих символов — либо "*" (звездочка), либо "." (точка), звездочка обозначает кубик, а точка — пустое место. Следующая строка содержит два числа: h2 и w2. Следующие h2 строк содержат по w2 символов и описывают вторую фигуру в формате, аналогичном первой. Каждая из фигур связна и содержит хотя бы один кубик.
Выведите в выходной файл одно число — максимальную площадь, которая может быть доступна хомячку. Если сделать клетку для хомячка невозможно, выведите 0.
1 ≤ h1, w1, h2, w2 ≤ 10
№ | Входной файл (cage.in ) |
Выходной файл (cage.out ) |
---|---|---|
1 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | convex.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | convex.out |
Множество на плоскости называется выпуклым, если вместе с любыми двумя точками оно содержит также и отрезок, соединяющий эти точки. Минимальное по включению множество, содержащее заданное множество точек X, называется выпуклой оболочкой множества X.
В этой задаче вам требуется найти выпуклую оболочку множества точек, принадлежащих заданному набору углов.
Углом называется геометрическая фигура, образованная двумя лучами, выходящими из одной точки. Эта точка называется вершиной угла.
На рисунке слева приведены два угла, на рисунке справа изображена их выпуклая оболочка.
Первая строка входного файла содержит число n — количество углов. Каждая из следующих n строк описывает углы. Каждый угол описывается координатами трех точек: вершины и двух отличных от вершины точек — по одной на каждом из лучей.
Выведите в выходной файл границу выпуклой оболочки в виде последовательности направленных лучей, прямых и отрезков. Никакие два объекта в выходном файле не должны лежать на одной прямой. Все отрезки должны иметь длину больше нуля. Объекты должны быть перечислены в таком порядке, чтобы начало каждого следующего совпадало с концом предыдущего. Все числа в выходном файле должны быть целыми и не превосходить 105 по абсолютной величине. При проходе вдоль описанной границы выпуклая оболочка углов должна быть справа.
На первой строке выведите l — количество объектов в ответе. Следующие l строк должны со- держать описание объектов. Объекты описываются следующим образом:
Если выпуклой оболочкой является вся плоскость, то выведите l = 0.
1 ≤ n ≤ 1000
Все координаты целые и не превышают 104 по абсолютной величине. Величина угла находится в диапазоне от 0 до 180 градусов, не включительно.
№ | Входной файл (convex.in ) |
Выходной файл (convex.out ) |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | expr.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | expr.out |
Петя — большой любитель математических головоломок. Недавно он прочитал в одном популярном журнале о новой головоломке. Он пытался ее решить несколько дней, но это ему так и не удалось. Помогите Пете справиться с неподдающейся задачей.
В ряд выписаны n чисел. Требуется поставить между каждой парой соседних чисел один из знаков " + " или × таким образом, чтобы значение получившегося выражения было как можно больше. Использовать скобки не разрешается.
Например, для последовательности чисел 1, 2, 3, 1, 2, 3 оптимально расставить знаки следующим образом: 1 + 2 × 3 × 1 × 2 × 3. Значение выражения в этом случае равно 37.
Первая строка входного файла содержит число n. Вторая строка содержит n целых чисел — числа, между которыми следует расставить знаки.
Выведите в выходной файл оптимальное выражение. В качестве знака × выводите символ "*" (звездочку). Если оптимальных решений несколько, выведите любое из них.
2 ≤ n ≤ 200 000
Все числа находятся в диапазоне от 0 до 109.
№ | Входной файл (expr.in ) |
Выходной файл (expr.out ) |
---|---|---|
1 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | fair.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | fair.out |
Последовательность из нулей и единиц четной длины назовем справедливой, если на четных местах этой последовательности столько же единиц, сколько на нечетных. Например, последовательность "011011" является справедливой, а последовательность "011101" — нет.
Задана некоторая последовательность нечетной длины из нулей и единиц. Из нее разрешается удалить одну цифру. Какую цифру следует удалить, чтобы последовательность стала справедливой?
Например, из последовательности "0111011" с этой целью можно удалить вторую цифру.
Входной файл содержит одну строку. Эта строка содержит последовательность нечетной длины из нулей и единиц.
Выведите в выходной файл одно число — номер цифры в последовательности, которую следует удалить, чтобы последовательность стала справедливой. Цифры нумеруются, начиная с 1. Если это сделать невозможно, выведите 0. Если решений несколько, выведите любое.
Длина последовательности не превышает 200 001.
№ | Входной файл (fair.in ) |
Выходной файл (fair.out ) |
---|---|---|
1 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | fun.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | fun.out |
Дима обнаружил у папы на столе специальный чертежный прибор, похожий на циркуль — измеритель. Измеритель отличается от обычного циркуля тем, что в обеих его ножках находятся иголки (у обычного циркуля в одной ножке находится иголка, а в другой — грифель).
Дима взял клетчатый лист бумаги, установил между иглами измерителя некоторое расстояние, прочно зафиксировав его, и начал втыкать измеритель в лист бумаги. Каждый раз Дима втыкал в лист обе иглы измерителя, при этом он всегда делал это так, что дырочки получались в точках пересечениях линий, которыми лист разлинован на клетки. При этом в одну и ту же дырку Дима мог вставлять измеритель несколько раз.
Вечером папа нашел лист, с которым развлекался Дима, и решил выяснить, какое расстояние между иглами измерителя Дима мог установить. Все, что знает папа — координаты дырок, проделанных иглами измерителя. Помогите Папе решить поставленную задачу.
Первая строка входного файла содержит число n — количество дырок. Следующие n строк содержат по два целых числа — координаты дырок.
На первой строке выходного файла выведите k — количество различных расстояний, которые Дима мог установить между иглами измерителя. Следующие k строк должны содержать по одному вещественному числу — искомые расстояния. Расстояния должны быть выведены в возрастающем порядке. Каждое число должно быть выведено с точностью не менее чем 109.
2 ≤ n ≤ 1000
Координаты не превышают 104 по абсолютной величине.
Гарантируется, что существует по крайней мере одно расстояние, которое Дима мог установить между иглами измерителя.
№ | Входной файл (fun.in ) |
Выходной файл (fun.out ) |
---|---|---|
1 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | game.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | game.out |
Петя играет с друзьями в игру, которую иногда называют "Жребий Крижановского". Правила игры следующие: в каждом туре каждый игрок загадывает произвольное натуральное число. После этого игрок, загадавший минимальное число, которое не повторяется, выигрывает в этом туре, причем его выигрыш равен этому числу. Например, если играют 6 человек и были загаданы числа 3, 2, 1, 1, 4 и 2, то выиграл первый игрок, причем его выигрыш равен 3. Если все загаданные числа повторяются, то тур считается ничейным и никто баллов не получает.
Петя с друзьями при игре просто называют по очереди загаданные ими числа, а потом определяют, кто выиграл, и подсчитывают баллы. Однако при таком формате игры в принципе можно сжульничать, не загадывая число заранее, а, уже зная числа, названные предыдущими игроками, выбрать себе оптимальное "загаданное" число. Этим и пользуется Петя. Он называет число последним и старается выбрать число так, чтобы максимизировать свой выигрыш.
Идет последний тур игры. Известны очки всех игроков перед этим туром и названные игроками числа. Выясните, какое число следует назвать Пете, чтобы по результатам игры у как можно большего числа игроков количество баллов было меньше чем у него. Если таких чисел несколько, то Петя хочет назвать минимальное возможное.
Общий выигрыш игрока за игру равен сумме баллов за все сыгранные туры.
Первая строка входного файла содержит число n — количество игроков. Вторая строка содержит n чисел — баллы игроков перед последним туром (неотрицательные целые числа, не большие 100). Баллы перечислены в том порядке, в котором игроки обычно называют числа (то есть Петины баллы указаны последними). Третья строка содержит n − 1 число — числа, названные игроками в последнем туре (числа не превышают 100), в том порядке, в котором они их называли.
Выведите в выходной файл число, которое следует назвать Пете.
Во втором примере Петя не может выиграть в последнем туре. Однако, назвав число 2, Петя не позволяет выиграть первому игроку, и тем самым остается вторым по итогам всей игры. У четырех игроков баллы меньше чем у Пети.
2 ≤ n ≤ 100
№ | Входной файл (game.in ) |
Выходной файл (game.out ) |
---|---|---|
1 |
|
|
2 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | program.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | program.out |
Компания "Макрохард" заказала у одного известного психолога полное психологическое обследование всех работников компании. Психолог, привлеченный для проведения обследования, известен своим инновационным методом, позволяющим составить полную психологическую картину сотрудника по наиболее часто используемому им в программах идентификатору. Однако, к сожалению, программа, используемая в анализе, оказалась неожиданно испорчена вирусом, поэтому требуется срочно написать новую. Помогите известному психологу. Напишите программу, которая по приведенной программе выяснит наиболее часто используемый в ней идентификатор.
Поскольку разные сотрудники компании пишут программы на разных языках программирования, ваша программа должна уметь работать с произвольным языком. Поскольку в разных языках используются различные ключевые слова, то список ключевых слов в анализируемом языке предоставляется на вход программе. Все последовательности из латинских букв, цифр и знаков подчеркивания, которые не являются ключевыми словами и содержат хотя бы один символ, не являющийся цифрой, могут быть идентификаторами. При этом в некоторых языках идентификаторы могут начинаться с цифры, а в некоторых — нет. Если идентификатор не может начинаться с цифры, то последовательность, начинающаяся с цифры, идентификатором не является. Кроме этого, задано, является ли язык чувствительным к регистру символов, используемых в идентификаторах и ключевых словах.
Первая строка входного файла содержит число n — количество ключевых слов в языке, и два слова c и d, каждое из которых равно либо "yes", либо "no". Слово c равно "yes", если идентификаторы и ключевые слова в языке чувствительны к регистру символов, и no, если нет. Слово d равно "yes", если идентификаторы в языке могут начинаться с цифры, и no, если нет.
Следующие n строк содержат по одному слову, состоящему из букв латинского алфавита и символов подчеркивания — ключевые слова. Все ключевые слова непусты, различны, при этом, если язык не чувствителен к регистру, то различны и без учета регистра.
Далее до конца файла идет текст программы. Он содержит только символы с ASCII-кодами от 32 до 126 и переводы строки. В программе есть хотя бы один идентификатор.
Выведите в выходной файл идентификатор, встречающийся в программе максимальное число раз. Если таких идентификаторов несколько, следует вывести тот, который встречается в первый раз раньше. Если язык во входном файле не чувствителен к регистру, то можно выводить идентификатор в любом регистре.
0 ≤ n ≤ 50
Длина каждого ключевого слова не превышает 50 символов.
№ | Входной файл (program.in ) |
Выходной файл (program.out ) |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | puzzle.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | puzzle.out |
Пете на день рождения подарили новую головоломку. Головоломка представляет собой цилиндр, состоящий из n круглых слоев, нанизанных на одну вертикальную ось. Каждый слой можно вращать независимо от других. Каждый слой разбит на n квадратиков, каждый из которых может быть либо черным, либо белым. В устойчивом состоянии квадратики соседних слоев находятся в точности друг под другом.
Для задания конфигурации головоломки удобно рассмотреть ее развертку — "разрезать" поверхность цилиндра вдоль вертикальной линии, проходящей по границам квадратиков, и обозначить черные клетки символом "0", а белые — символом "1". Пусть, например, одна из возможных разверток головоломки, приведенной на рисунке, следующая (на рисунке видно только первые три столбца этой развертки):
000110 001110 101000 001000 011111 011110
Задача решающего головоломку состоит в том, чтобы, поворачивая слои, добиться того, чтобы все вертикальные столбцы были различны. Например, головоломка приведенная выше, не решена, поскольку два из ее столбцов (четвертый и пятый на приведенной развертке) одинаковы. Если же повернуть нижний слой влево на один квадратик, развертка головоломки примет следующий вид:
000110 001110 101000 001000 011111 111100Теперь все столбцы различны и следовательно головоломка решена. Для того, чтобы решать головоломку было интереснее, на ее раскраску наложено дополнительное условие: нельзя повернуть один из слоев головоломки меньше чем на полный оборот таким образом, что внешний вид головоломки останется тем же. Так, например, для n = 6 слой с раскраской "010101" не разрешается, поскольку при его повороте на 2 квадратика внешний вид головоломки не меняется.
По заданной развертке головоломки выясните, можно ли ее решить, и если да, то приведите пример развертки решенной головоломки.
Первая строка входного файла содержит число n — количество слоев в головоломке и количество квадратиков в одном слое. Следующие n строк содержат по n символов, каждый из которых равен 0 или 1 — развертку головоломки.
Если решить головоломку можно, на первой строке выходного файла выведите слово "Yes". В этом случае следующие n строк должны содержать произвольную развертку решенной головоломки.
Если решить головоломку нельзя, выведите "No" на первой строке выходного файла.
1 ≤ n ≤ 200
№ | Входной файл (puzzle.in ) |
Выходной файл (puzzle.out ) |
---|---|---|
1 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | shelter.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | shelter.out |
Штаб гражданской обороны Тридесятой области решил обновить план спасения на случай ядерной атаки. Известно, что все n селений Тридесятой области находятся вдоль одной прямой дороги. Вдоль дороги также расположены m бомбоубежищ, в которых жители селений могут укрыться на случай ядерной атаки.
Чтобы спасение в случае ядерной тревоги проходило как можно эффективнее, необходимо для каждого селения определить ближайшее к нему бомбоубежище.
Первая строка входного файла содержит число n — количество селений. Вторая строка содержит n различных целых чисел, i-е из этих чисел задает расстояние от начала дороги до i-го селения.
Третья строка входного файла содержит число m — количество бомбоубежищ. Четвертая строка содержит m различных целых чисел, i-е из этих чисел задает расстояние от начала дороги до i-го бомбоубежища.
Выведите в выходной файл n чисел — для каждого селения выведите номер ближайшего к нему бомбоубежища. Бомбоубежища пронумерованы от 1 до m в том порядке, в котором они заданы во входном файле.
1 ≤ n, m ≤ 100 000
Все расстояния положительны и не превышают 109. Селение и убежище могут располагаться в одной точке.
№ | Входной файл (shelter.in ) |
Выходной файл (shelter.out ) |
---|---|---|
1 |
|
|
Автор: | Восьмая всероссийская командная олимпиада школьников по программированию | Ограничение времени: | 2 сек | |
Входной файл: | traffic.in | Ограничение памяти: | 256 Мб | |
Выходной файл: | traffic.out |
При организации движения по сложным перекресткам, для того, чтобы траектории водителей, выполняющих различные маневры не пересекались, вводят ограничения на возможные маневры водителей, в зависимости от того, по какой полосе движения водитель подъехал к перекрестку. Для этого используется знак "движение по полосам", на рисунке справа приведен пример такого знака, установленного перед одним из перекрестков в Санкт-Петербурге.
Рассмотрим дорогу, подходящую к перекрестку, на котором сходится m дорог. Водитель, подъезжающий к перекрестку по этой дороге, потенциально может продолжить свое движение в m различных направлениях — обратно по дороге, по которой он приехал, а также по одной из оставшихся m − 1 дорог. Пронумеруем возможные направления числами от 1 до m слева направо с точки зрения подъезжающего водителя, номер 1 получит разворот и возврат по дороге, по которой водитель подъезжал к перекрестку, номер 2 — поворот на самую левую из дорог, и т. д.
Пусть дорога содержит n полос для движения. Пронумеруем полосы от 1 до n слева направо, самая левая полоса получит номер 1, следующая номер 2, и т. д. Знак "движение по полосам" разрешает каждой из полос движение по некоторым из m возможных направлений. При этом должны выполняться следующие условия:
Инспекция по безопасности дорожного движения заинтересовалась, а сколько различных знаков "движение по полосам" можно установить перед таким перекрестком. Помогите им найти ответ на этот вопрос.
Входной файл содержит два целых числа: m и n.
В выходной файл выведите одно число — количество возможных знаков "движение по полосам", которые можно установить перед перекрестком.
В примере возможны следующие варианты знаков "движение по полосам":
С левой полосы | С правой полосы |
разворот | разворот, налево, прямо, направо |
разворот | налево, прямо, направо |
разворот, налево | налево, прямо, направо |
разворот, налево | прямо, направо |
разворот, налево, прямо | прямо, направо |
разворот, налево, прямо | направо |
разворот, налево, прямо, направо | направо |
2 ≤ m ≤ 50, 1 ≤ n ≤ 15
№ | Входной файл (traffic.in ) |
Выходной файл (traffic.out ) |
---|---|---|
1 |
|
|