Задача 1 « Ближайшие точки

advertisement
Задания краевой заочной олимпиады школьников по информатике
в 2007/2008 учебном году
Задача 1 « Ближайшие точки »
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
nearest.in
nearest.out
2 секунды
64 мегабайта
Антон в школе начал изучать математику. Его внимание привлекло новое для него
понятие числовой прямой. Антон быстро научился вычислять расстояния между двумя
точками на этой прямой, задавать отрезки и интервалы на ней.
Готовясь к контрольной работе, Антон столкнулся со следующей задачей: «На
числовой прямой задано n точек. Необходимо найти среди них две ближайшие». Расстояние
между двумя точками числовой прямой x и y равно |x  y|.
Требуется написать программу, которая поможет Антону решить поставленную задачу.
Формат входных данных
Первая строка входного файла содержит количество точек n (2 ≤ n ≤ 105). Вторая строка
входного файла содержит n различных целых чисел xi – координаты заданных точек
числовой прямой. Числа в строке разделены пробелом. Значения всех координат xi не
превосходят 109 по абсолютной величине.
Формат выходных данных
В первой строке выходного файла необходимо вывести минимальное расстояние
между двумя точками, заданными во входном файле. Во второй строке выходного файла
необходимо вывести номера точек, которым соответствует найденное расстояние. Точки
нумеруются натуральными числами от 1 до n в порядке, в котором они заданы во входной
файле. Если ответов несколько, выведите любой из них.
Примеры входных и выходных файлов
nearest.in
5
10 3 6 2 5
nearest.out
1
2 4
Задача 2 “Числовая последовательность »
numseq.in
numseq.out
2 секунды
64 мегабайта
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
Дима недавно поступил на работу в научно-исследовательский институт «Числовые
Последовательности». Как следует из названия этого института, основным направлением
его
работы
является
проведение
различных
исследований
в
области
числовых
последовательностей. Недавно руководитель отдела, где начал работать Дима, при решении
одной
из
проблем
столкнулся
с
весьма
интересной
последовательностью
чисел
a1, a2, …, an, …, которая определяется следующим образом: следующим образом: a1 = 0 и
каждое последующее число ai (1  i ≤ n) определяется как наименьшее большее натуральное
число, десятичная запись которого не содержит цифр, представленных в десятичной записи
ai-1.
Требуется написать программу, которая по значению числа n вычисляет величину an.
Формат входных данных
Входной файл содержит целое число n (1 ≤ n ≤ 500).
Формат выходных данных
В выходной файл необходимо вывести ответ на задачу.
Примеры входных и выходных файлов
numseq.in
1
28
numseq.out
0
911
Страница 2 из 9
Задача 3 « Вписанная окружность »
polygon.in
polygon.out
2 секунды
64 мегабайта
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
Очень интересными объектами, которые изучаются в планиметрии, являются
вписанные и описанные окружности. Известно, например, что вокруг любого треугольника
можно описать окружность и в любой треугольник можно вписать окружность. А что будет,
если вместо треугольника задан выпуклый многоугольник?
Требуется написать программу, которая определяет, можно ли в заданный выпуклый
многоугольник вписать окружность, и, если это можно сделать, то вычисляет координаты ее
центра и радиус.
Формат входных данных
Первая строка входного файла количество вершин многоугольника n (3 ≤ n ≤ 8).
Последующие n строк содержат координаты вершин многоугольника в порядке обхода
против часовой стрелки, каждая i-ая из них содержит два целых числа: xi и yi, значения
которых не превосходят 1000 по абсолютной величине.
Формат выходных данных
Если окружность, вписанная в заданный многоугольник, существует, необходимо
вывести в первой строке выходного файла слово YES, иначе – слово NO. В случае
положительного ответа выведите во второй строке координаты центра окружности и ее
радиус. При проверке решения задачи все величины будут сравниваться с точностью до 10-6.
Примеры входных и выходных файлов
polygon.in
4
0
1
1
0
4
0
1
1
0
0
0
1
1
polygon.out
YES
0.5 0.5 0.5
NO
0
0
2
2
Страница 3 из 9
Задача 4 « Разрезание прямоугольника »
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
На координатной плоскости задан прямоугольник, высота
rect.in
rect.out
2 секунды
64 мегабайта
которого h, а ширина — w.
Внутри прямоугольника заданы отрезки, параллельные осям координат и с концами,
имеющими целочисленные координаты.
Прямоугольник планируется разрезать на несколько частей горизонтальными или
вертикальными разрезами. За один шаг разрешается разрезать на две непустые
прямоугольные части только один из имеющихся на этом шаге прямоугольников. При этом
запрещается при разрезе пересекать, хотя бы один из заданных отрезков.
Требуется написать программу, позволяющую найти количество способов разрезания
исходного прямоугольника на k частей вертикальными и горизонтальными разрезами.
Способы, отличающиеся порядком проведения разрезов, считаются различными.
Формат входных данных
Первая строка входного файла содержит размеры прямоугольника – целые числа h и
w (1 ≤ h, w ≤ 8). Вторая строка входного файла содержит целое число k – количество частей,
на которые требуется разрезать прямоугольник (1 ≤ k ≤ hw). Третья строка содержит целое
число cnt (0 ≤ cnt ≤ 10) — количество заданных внутри прямоугольника отрезков.
Последующие cnt строк содержат описания этих отрезков, то есть, каждая строка содержит
четыре целых числа x1, y1, x2, y2 (0 ≤ x1 ≤ x2 ≤ w, 0 ≤ y1 ≤ y2 ≤ h) — координаты концов отрезка.
Все числа в строках разделены пробелом.
Формат выходных данных
В выходной файл необходимо вывести одно целое число — искомое количество
способов разрезания исходного прямоугольника. Ответ должен быть представлен по
модулю 230.
Пример входного и выходного файлов
rect.in
2 2
4
0
8 8
20
0
4 4
2
2
2 0 2 3
2 3 4 3
rect.out
4
767625216
3
Страница 4 из 9
Задача 5 « Рекурсия »
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
recurs.in
recurs.out
2 секунды
64 мегабайта
«Чтобы понять рекурсию, надо понять рекурсию»
Фольклор
Одним из важных понятий, используемых в теории алгоритмов, является рекурсия.
Неформально ее можно определить как использование в описании объекта самого себя. Если
речь идет о процедуре, то в процессе исполнении эта процедура напрямую или
косвенно (через другие процедуры) вызывает сама себя.
Рекурсия является очень «мощным» методом построения алгоритмов, но таит в себе
некоторые опасности. Например, неаккуратно написанная рекурсивная процедура может
войти в бесконечную рекурсию, то есть, никогда не закончить свое выполнение (на самом
деле, выполнение закончится с переполнением стека).
Поскольку рекурсия может быть косвенной (процедура вызывает сама себя через
другие процедуры), то задача определения того факта, является ли данная процедура
рекурсивной, достаточно сложна. Попробуем решить более простую задачу.
Рассмотрим программу, состоящую из n процедур P1, P2, …, Pn. Пусть для каждой
процедуры известны процедуры, которые она может вызывать. Процедура P называется
потенциально рекурсивной, если существует такая последовательность процедур Q0, Q1, …,
Qk, что Q0 = Qk = P и для i = 1…k–1 процедура Qi-1 может вызвать процедуру Qi. В этом
случае задача будет заключаться в определении для каждой из заданных процедур, является
ли она потенциально рекурсивной.
Требуется написать программу, которая позволит решить названную задачу.
Формат входных данных
Первая строка входного файла содержит целое число n — количество процедур в
программе (1 ≤ n ≤ 100).
Далее следуют n блоков, описывающих процедуры. Блоки отделены друг от друга и от
первой строки входного файла строками, каждая из которых содержит по 5 символов «*».
Описание процедуры начинается со строки, содержащий ее идентификатор, состоящий
только из маленьких букв латинского алфавита и цифр. Идентификатор непуст, и его длина
не превосходит 100 символов. Далее идет строка, содержащая число k (k ≤ n ) — количество
процедур, которые могут быть вызваны описываемой процедурой. Последующие k строк
содержат идентификаторы этих процедур — по одному идентификатору на строке.
Страница 5 из 9
Различные процедуры имеют различные идентификаторы. При этом ни одна процедура
не может вызвать процедуру, которая не описана во входном файле.
Формат выходных данных
Для каждой процедуры, присутствующей во входном файле, необходимо вывести слово
YES, если она является потенциально рекурсивной, и слово NO – в противном случае.
Следуйте формату вывода, приведенному в примере. Процедуры в выходном файле
должны быть выведены в том же порядке, в каком они перечислены во входном файле.
Пример входного и выходного файлов
recurs.in
3
p1
2
p1
p2
*****
p2
1
p1
*****
p3
1
p1
recurs.out
p1: YES
p2: YES
p3: NO
Страница 6 из 9
Задача 6 « Сумма двух чисел »
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
sum.in
sum.out
2 секунды
64 мегабайта
Заданы три числа: a, b, c. Необходимо выяснить, можно ли так переставить цифры в
числах a и b, чтобы в сумме получилось c.
Формат входных данных
Входной файл содержит три целых числа: a, b, c (0 < a, b, c < 109). Числа разделены
пробелом.
Формат выходных данных
Если искомая перестановка цифр возможна, необходимо вывести в выходной файл
слово YES, в противном случае — выведите слово NO. При положительном ответе
необходимо вывести во второй строке выходного файла число x, получаемое перестановкой
цифр числа a, и число y, получаемое перестановкой цифр числа b, сумма которых равна c.
Числа x и y не должны содержать ведущих нулей. Числа в строке разделены пробелом.
Примеры входных и выходных файлов
sum.in
12 31 25
12 31 26
sum.out
YES
12 13
NO
Страница 7 из 9
Задача 7 « Укладка плиток »
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
tiling.in
tiling.out
2 секунды
64 мегабайта
Вы являетесь одним из разработчиков нового архитектурного пакета прикладных
программ CadArch. Одной из его функций является проектирование укладки половых
плиток. В настоящее время вы занимаетесь программной реализацией модуля, который
отвечает за укладку плиток в прямоугольных помещениях.
Для простоты будем считать, что пол помещения представляет собой прямоугольник
размером n на m метров, разбитый на m∙n квадратиков со стороной по 1 метру. Кроме этого,
будем считать, что имеется четыре типа плиток, показанные в таблице. Каждая из плиток
представляет собой квадрат размером 2 на 2 метра, из которого вырезан один квадратик
размером 1 на 1 метр.
1
2
3
4
Проектируемый модуль должен работать следующим образом. На вход модуля
подается набор команд, каждая из которых обозначает, в какое место и какого типа плитку
необходимо положить. Команда обрабатывается следующим образом: если ни один из
квадратиков, который должна занимать текущая плитка, не занят и плитка полностью
помещается внутри прямоугольника, то плитка размещается в указанном месте, в противном
случае – нет.
Требуется написать программу, которая определяет, какая площадь в соответствии с
заданным набором команд будет покрыта плитками.
Формат входных данных
Первая строка входного файла содержит два числа m и n — размеры пола
помещения (1 ≤ m, n ≤ 50). Вторая строка содержит число k — количество команд, которые
Страница 8 из 9
необходимо обработать (0 ≤ k ≤ 1000). Каждая из последующих k строк содержит описание
одной команды из набора команд. Описание команды состоит из трех чисел. Первое число
определяет тип плитки (число от 1 до 4), а два других  координаты левого верхнего
квадрата размером 2 на 2, в который вписана соответствующая плитка.
Формат выходных данных
В выходной файл необходимо вывести одно число, определяющее площадь, покрытую
плитками после выполнения заданной во входном файле последовательности команд.
Примеры входных и выходных файлов
tiling.in
4
4
4
2
3
1
4
1
2
1
3
tiling.out
6
1
2
1
3
Страница 9 из 9
Download