ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
Подтемы:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Версия для печати
Убрать все задачи Круг поделили хордой AB на два круговых сегмента и один из них повернули на некоторый угол вокруг точки A. При этом повороте точка B перешла в точку D (см. рис.). Докажите, что отрезки, соединяющие середины дуг сегментов с серединой отрезка BD, перпендикулярны друг другу. Решение
Пете поручили написать менеджер памяти для новой стандартной библиотеки языка H++. В распоряжении у менеджера находится массив из N последовательных ячеек памяти, пронумерованных от 1 до N. Задача менеджера - обрабатывать запросы приложений на выделение и освобождение памяти. Запрос на выделение памяти имеет один параметр K. Такой запрос означает, что приложение просит выделить ему K последовательных ячеек памяти. Если в распоряжении менеджера есть хотя бы один свободный блок из K последовательных ячеек, то он обязан в ответ на запрос выделить такой блок. При этом непосредственно перед самой первой ячейкой памяти выделяемого блока не должно располагаться свободной ячейки памяти. После этого выделенные ячейки становятся занятыми и не могут быть использованы для выделения памяти, пока не будут освобождены. Если блока из K последовательных свободных ячеек нет, то запрос отклоняется. Запрос на освобождение памяти имеет один параметр T. Такой запрос означает, что менеджер должен освободить память, выделенную ранее при обработке запроса с порядковым номером T. Запросы нумеруются, начиная с единицы. Гарантируется, что запрос с номером T - запрос на выделение, причем к нему еще не применялось освобождение памяти. Освобожденные ячейки могут снова быть использованы для выделения памяти. Если запрос с номером T был отклонен, то текущий запрос на освобождение памяти игнорируется. Требуется написать менеджер памяти, удовлетворяющий приведенным критериям. Формат входных данных Первая строка входного файла содержит числа N и M - количество ячеек памяти и количество запросов соответственно (1 ≤ N ≤ 231 - 1; 1 ≤ M ≤ 105). Каждая из следующих M строк содержит по одному числу: (i+1)-я строка входного файла (1 ≤ i ≤ M) содержит либо положительное число K, если i-й запрос - запрос на выделение с параметром K (1 ≤ K ≤ N), либо отрицательное число -T, если i-й запрос - запрос на освобождение с параметром T (1 ≤ T < i). Формат выходных данных Для каждого запроса на выделение памяти выведите в выходной файл результат обработки этого запроса: для успешных запросов выведите номер первой ячейки памяти в выделенном блоке, для отклоненных запросов выведите число -1. Результаты нужно выводить в порядке следования запросов во входном файле. Пример
|
Страница: << 24 25 26 27 28 29 30 >> [Всего задач: 155]
Очередность выходов артистов на сцену и их уходов за кулисы указывается в режиссерском плане. Кроме того, в этом плане указывается, через какие кулисы выходит (или уходит) артист и поет ли он в данном выходе. Напишите программу, которая по заданному режиссерскому плану
определяет минимальное количество требуемых для постановки оперы
микрофонов, их начальное размещение по кулисам и для каждого выхода
указывает, брать или не брать микрофон.
Пете поручили написать менеджер памяти для новой стандартной библиотеки языка H++. В распоряжении у менеджера находится массив из N последовательных ячеек памяти, пронумерованных от 1 до N. Задача менеджера - обрабатывать запросы приложений на выделение и освобождение памяти. Запрос на выделение памяти имеет один параметр K. Такой запрос означает, что приложение просит выделить ему K последовательных ячеек памяти. Если в распоряжении менеджера есть хотя бы один свободный блок из K последовательных ячеек, то он обязан в ответ на запрос выделить такой блок. При этом непосредственно перед самой первой ячейкой памяти выделяемого блока не должно располагаться свободной ячейки памяти. После этого выделенные ячейки становятся занятыми и не могут быть использованы для выделения памяти, пока не будут освобождены. Если блока из K последовательных свободных ячеек нет, то запрос отклоняется. Запрос на освобождение памяти имеет один параметр T. Такой запрос означает, что менеджер должен освободить память, выделенную ранее при обработке запроса с порядковым номером T. Запросы нумеруются, начиная с единицы. Гарантируется, что запрос с номером T - запрос на выделение, причем к нему еще не применялось освобождение памяти. Освобожденные ячейки могут снова быть использованы для выделения памяти. Если запрос с номером T был отклонен, то текущий запрос на освобождение памяти игнорируется. Требуется написать менеджер памяти, удовлетворяющий приведенным критериям. Формат входных данных Первая строка входного файла содержит числа N и M - количество ячеек памяти и количество запросов соответственно (1 ≤ N ≤ 231 - 1; 1 ≤ M ≤ 105). Каждая из следующих M строк содержит по одному числу: (i+1)-я строка входного файла (1 ≤ i ≤ M) содержит либо положительное число K, если i-й запрос - запрос на выделение с параметром K (1 ≤ K ≤ N), либо отрицательное число -T, если i-й запрос - запрос на освобождение с параметром T (1 ≤ T < i). Формат выходных данных Для каждого запроса на выделение памяти выведите в выходной файл результат обработки этого запроса: для успешных запросов выведите номер первой ячейки памяти в выделенном блоке, для отклоненных запросов выведите число -1. Результаты нужно выводить в порядке следования запросов во входном файле. Пример
Петя и Вася нашли на чердаке остатки рыболовной сети своего деда. Часть веревок давно сгнила, и сеть распалась на большое число кусков, каждый из которых состоит не более чем из 50 веревочек единичной длины. Так как использовать по назначению остатки данной сети было уже нельзя, братья разложили один из найденных кусков на прямоугольном столе так, что веревочки оказались параллельны сторонам стола, и стали играть в следующую игру. Братья делают ходы по очереди, Петя ходит первым. Своим ходом игрок находит веревочку, являющуюся стороной некоторой целой единичной квадратной ячейки сети (все четыре образующие ее веревочки целы), и перерезает выбранную веревочку. Проигрывает тот из братьев, который не может сделать очередной ход. Требуется написать программу, которая по описанию куска сети на столе определяет, может ли Петя выиграть при любой игре Васи, и если да, то какой первый ход он должен для этого сделать. Формат входных данных В первой строке входного файла задано число N (1 ≤ N ≤ 50) - количество веревочек единичной длины, из которых состоит кусок сети. Следующие N строк входного файла содержат по две пары целых чисел - координаты концов веревочек. Каждая четверка чисел описывает отрезок единичной длины, параллельный одной из осей координат. Координаты всех точек неотрицательны и не превосходят 50. Формат выходных данных Первая строка выходного файла должна содержать число 1, если Петя может выиграть при любой игре Васи, и число 2, если нет. В случае выигрыша Пети вторая строка должна содержать номер веревочки, которую он должен перерезать первым ходом. Если возможных выигрышных ходов несколько, выведите любой. Веревочки пронумерованы, начиная с 1, в том порядке, в котором они заданы во входном файле. Примечание Максимальная оценка за решение задачи при N ≤ 13 равна 40 баллам. Пример
1) перестановки N-элементного множества (лексикографический порядок); 2) K-элементные подмножества N-элементного множества (лексикографический порядок); 3) разбиения N-элементного множества на K непустых подмножеств (лексикографический, т.е. алфавитный, порядок); 4) разбиения числа N на слагаемые; 5) правильные скобочные последовательности из 2N скобок; 6) двоичные деревья с N вершинами; 7) цепочки из нулей и единиц длины N без двух единиц подряд; 8) перестановки N-элементного множества (порядок, в котором соседние перестановки отличаются транспозицией соседних элементов); 9) K-элементные подмножества N-элементного множества (порядок, в котором соседние подмножества отличаются двумя элементами); 10) все подмножества N-элементного множества (порядок, в котором соседние подмножества отличаются добавлением или удалением одного элемента); 11) подвешенные деревья с N вершинами; решить следующие две подзадачи: найти общее количество объектов и породить M объектов, начиная с L-го; по заданным объектам получить их номера. В качестве N-элементного множества везде подразумевается множество {1, ..., N}. Там, где порядок порождения комбинаторных объектов не указан, Вы можете выбрать его по своему усмотрению. Нумерация объектов начинается с нуля. Таким образом, Вам предстоит написать 11 программ. Задача
засчитывается, если Ваша программа прошла все тесты, в противном случае
Базовые типы данных Имеются несколько базовых типов данных: Integer, Char, Boolean и String. Константы этих типов записываются следующим образом. Константа типа String – это последовательность (длиной от 0 до 255) символов, заключенная либо в апострофы (▓), либо в двойные кавычки ("). При этом, если ограничители – апострофы, то внутри них апостроф удваивается, а кавычка нет. Аналогично, внутри кавычек двойная кавычка удваивается, а апостроф нет. В качестве символов будут использоваться ASCII-символы с кодами от 32 до 255. Единственная допустимая операция над строками – конкатенация (+). Константа типа Char – это константа типа String длины 1. Определена
операция Ord(<символ>), возвращающая ASCII-код заданного символа
Константы типа Boolean могут иметь только два значения: True и False. Над ними определены операции Or (или), And (и), Not (не). Кроме того, над всеми базовыми типами определены операции сравнения
(<, >, =, <=, >=, <>), которые возвращают результат типа Boolean. При этом
False < True.
Здесь:
1. <имя типа> – это идентификатор типа, который может быть определен как
до, так и после данного описания.
2. <перечислимый тип> ::= (<идентификатор 0> {,<идентификатор i>})
(i = 1, ..., N)
Возможны следующие операции над константами перечислимого типа:
Здесь <значение 1> и <значение 2> – константы одинакового типа, который
может быть одним из следующих: Integer, Char, Boolean, либо каким-то из
<перечислимых типов>. Если <значение 1> ? <значение 2>, то константы
<ограниченного типа> могут принимать любое значение из промежутка
[<значение 1>, <значение 2>]. Иначе множество констант этого типа пусто.
Над константами <ограниченного типа> допустимы те же операции, что и
над константами того типа, которому принадлежат <значение 1> и <значение
2>.
Константами <типа-последовательности>, описанного как Sequence Of <тип>, являются конечные последовательности констант типа <тип>. Константами <типа-последовательности>, описанного как Sequence (<поле> {, <поле>}), являются упорядоченные наборы из констант указанных типов (в том порядке, в котором они встречаются в описании). Однако при этом можно опускать те элементы, перед типами которых указано ключевое слово Optional. Константы <типа-последовательности> записываются следующим образом: {<Константа> {, <Константа>}}. Пустая последовательность обозначается символами { }. Над <типами-последовательностями> определена операция конкатенации <тип 1>@<тип 2>, результатом которой является новый тип, все константы которого получаются дописыванием к произвольной константе-последовательности <типа 1> справа константы-последовательности <типа 2>. К образованным таким способом новым типам опять можно применять операцию конкатенации. Аналогично, операция конкатенации определена и для констант
рассматриваемых типов. Кроме того, если для констант каждого из типов из
Константами <типа-множества>, описанного как Set Of <тип>, являются конечные множества констант указанного типа <тип>. В случае описания Multi Set Of <тип> это будут конечные мультимножества (т.е. множества, в которых элементы могут повторяться более одного раза). Константами <типа-множества>, описанного как Set (<тип> {, <тип>}) являются конечные мультимножества, полученные взятием произвольных констант указанных в описании типов (по одной константе каждого типа с учетом кратности). Константы <типа-множества> записываются следующим образом: {<Константа> {, <Константа>}}. Пустое множество обозначается символами { }. Над <типами-множествами> возможны следующие операции
(результатом которых является, как легко заметить, опять некоторый <тип-множество>): Plus (объединение), Minus (разность), Mul (пересечение).
Например, константы типа A Mul B – это те (мульти-) множества, которые
одновременно являются константами типа A и константами типа B. Эти же
операции определены (с учетом кратности элементов) и для констант <типов-множеств>. Например, {1, 2, 2} Minus {2, 3} = {1, 2}, {3, 3, 5} Mul {3, 5, 5} =
{3, 5}.
Определения этих операций см. выше.
Комментарий – это последовательность символов любой длины,
начинающаяся с символов // и заканчивающаяся символами перевода строки.
Комментарии могут располагаться в любом месте программы и должны
опускаться при разборе.
Страница: << 24 25 26 27 28 29 30 >> [Всего задач: 155] |
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|