ЗАДАЧИ
problems.ru
О проекте | Об авторах | Справочник
Каталог по темам | по источникам |
К задаче N

Проект МЦНМО
при поддержке
ЦПМ
Фильтр
Сложность с по   Класс с по  
Задачи

Страница: << 49 50 51 52 53 54 55 >> [Всего задач: 272]      



Задача 102944

 [Отравленный пирог ]
Темы:   [ Динамическое программирование в игровых задачах ]
[ Построение перечислителя ]
Сложность: 4

Для игры «Отравленный пирог» используется прямоугольный пирог, разделенный на M «строк» горизонтальными разрезами и на N «столбцов» – вертикальными. Таким образом, пирог должен быть разбит на M × N клеток, правая нижняя из которых «отравлена». Играют двое игроков, ходы делаются по очереди. Каждый ход заключается в том, что игрок выбирает одну из еще не съеденных клеток пирога и съедает все клетки, расположенные левее и выше выбранной (в том числе и выбранную). Проигрывает тот, кто съедает отравленную клетку.

Требуется написать программу, которая по заданной игровой позиции определяет все возможные выигрышные ходы для начинающего в этой позиции. 

Входные данные

Данные во входном файле расположены в следующем порядке: M, N (1 ≤ M, N ≤ 9), X1, ..., XM. Здесь Xi – число оставшихся клеток в i-м снизу горизонтальном ряду. Все числа во входном файле разделяются пробелами и/или символами перевода строки.

Выходные данные

В первую строку выходного файла необходимо вывести количество различных выигрышных ходов К, а в последующие K строк – сами выигрышные ходы.

Каждый ход задается парой чисел (i, j), где i – номер (снизу) горизонтального ряда, а j – номер (справа) вертикального ряда, которому принадлежит выбранная клетка (1 ≤ i ≤ M, 1 ≤ j ≤ N).

Пример входного файла

3 5
5 4 3

Пример выходного файла

1
3 1
Прислать комментарий     Решение


Задача 102947

 [Острова ]
Тема:   [ Неопределено ]
Сложность: 4

Генератор случайных карт известной игры Heroes of Might and Magic III создает острова, на которых изначально будут расположены герои. При такой генерации острова получаются различными по величине. Назовем коэффициентом несправедливости отношение площади наибольшего острова к площади наименьшего. Требуется определить этот коэффициент.

Карта задается прямоугольником N × M, в каждой клетке которого записана цифра 0 (вода) или цифра 1 (земля). Островом считается максимальное связное множество клеток, содержащих единички, т.е. такое множество клеток A, что:
    из любой клетки A можно пройти до любой другой клетки A, переходя лишь через клетки A и их стороны;
    при добавлении к A любой другой клетки, содержащей 1, предыдущее условие нарушается.

Входные данные

В первой строке входного файла содержатся числа N и M – размеры карты (1 ≤ N, M ≤ 1000). Далее записана сама карта – M строк по N чисел (0 или 1) в каждой. Числа внутри строки разделяются пробелом.

Выходные данные

В выходной файл вывести коэффициент несправедливости с 5 знаками после десятичной точки. Если на карте нет ни одного острова, вывести 0.

Пример входного файла

7 6
1 1 0 0 0 0 0
0 1 0 1 0 0 0
1 1 0 1 1 0 0
1 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 0 1 0

Пример выходного файла

2.66667
Прислать комментарий     Решение


Задача 102956

 [Типы данных ]
Тема:   [ Синтаксический разбор (прочее) ]
Сложность: 4

Тип данных в языке Pascal представляет собой древовидную структуру, в листьях которой записаны базовые (предопределенные) типы данных (такие, как Integer или Char), а во внутренних узлах – конструкторы, позволяющие из одних типов данных строить другие (например, Array или Record). Вершины, соответствующие листьям, называются элементами данного типа. Имеются описания типов данных, взятые из первых строк программы, написанной на языке Turbo Pascal 7.0 (см. пример входного файла), и последовательность запросов, каждый из которых касается одного из описанных типов.

Всего существует три вида запросов:
    SizeInBytes(<Имя типа>) – определить, какое количество байт памяти занимает переменная указанного типа;
    SizeInBits(<Имя типа>) – найти количество бит, необходимых для хранения переменной указанного типа при условии, что для каждого элемента этой переменной отводится минимально возможное число бит, способных закодировать все возможные значения этого элемента;
    <Имя типа>($<Последовательность 16-х цифр>) – по дампу (т.е. содержимому) участка памяти, занимаемому переменной указанного типа, определить значения всех элементов этой переменной.
Напишите программу, которая вводит описания типов данных и обрабатывает заданную последовательность запросов. Описания типов не будут содержать типов-указателей, типов-файлов, типов-объектов и процедурных типов.

Процесс разработки Вашей программы постройте по следующей схеме: 
    А) Научите Вашу программу воспринимать стандартные типы данных, используемые в языке Turbo Pascal 7.0.
    Б) Введите перечислимый тип и тип-диапазон, граничные значения которого заданы константами.
    В) Реализуйте конструкторы типов данных.
    Г) Добавьте возможность использования функций и операций при построении константного выражения.
    Д) Реализуйте остальные возможности, допускаемые языком.

Входные данные

Входной файл начинается с ключевого слова «Definitions», за которым следуют описания типов данных. Далее следует ключевое слово «Queries» и список запросов. Каждый запрос записан в отдельной строке входного файла. Учтите, что длина строки с запросом может превышать 255 символов. 

Выходные данные

Ваша программа должна вывести в выходной файл результаты обработки запросов в том же порядке, в котором запросы встречаются во входном файле.
На запрос первого или второго вида в отдельную строку выходного файла следует выдать сообщение «Type <Имя типа> requires x bytes/bits», где
x – искомое целое число. На запрос третьего вида необходимо перечислить значения всех элементов переменной указанного типа в том порядке, в котором эти элементы хранятся в оперативной памяти. Для каждого из элементов в отдельную строку выходного файла следует выдать строку «<Имя элемента> = <Значение>». Формат выходного файла должен соответствовать приведенному ниже примеру.

Пример входного файла


Definitions


Type
TClass = 1..11;
TScore = 0..100;
TTour = 1..10;
TStrange =
Array
[1..SizeOf(Input)
Div
Ord('A')]
Of
Boolean;
TExample =
Record
a :
Array
[1..2]
Of

Record
b,c :
Set

Of
0..2
End



End
;
TShortStr =
String
[3];


Type
TParticipant =
Record

Sex : (Male, Female);
Name :
String
[20];
Class : TClass;
Place : ShortInt;
TotalSum : 0..High(TScore)*(High(TTour)-Low(TTour)+1);
DayScores :
Array
[TTour]
Of
TScore;

End
;

{ Команда России для участия в международной олимпиаде }
TTeam =
Array
[1..5]
Of
TParticipant;


Queries

SizeInBytes(TStrange)
SizeInBits(TClass)
SizeInBits(TShortStr)
TParticipant( $ 01118AAEABECE6AEA2A02091A2A5E2ABA0ADA00000000A0B4501461D082319501C280A00 )
TExample( $01020304 )
SizeInBits(TParticipant)

Пример выходного файла

Type TStrange requires 3 bytes
Type TClass requires 4 bits
Type TShortStr requires 26 bits
Sex = Female
Name = 'Кольцова Светлана'
Class = 10
Place = 11
TotalSum = 325
DayScores[1] = 70
DayScores[2] = 29
DayScores[3] = 8
DayScores[4] = 35
DayScores[5] = 25
DayScores[6] = 80
DayScores[7] = 28
DayScores[8] = 40
DayScores[9] = 10
DayScores[10] = 0
a[1].b = [0]
a[1].c = [1]
a[2].b = [0,1]
a[2].c = [2]
Type TParticipant requires 258 bits
Прислать комментарий     Решение


Задача 102941

 [Маятник ]
Тема:   [ Выпуклая оболочка ]
Сложность: 4+

Рассмотрим математический маятник, прикрепленный к началу координат математической нитью. Начальное положение маятника (-r, 0). Если маятник отпустить, то он начнет колебаться, описывая полуокружность. Теперь представим себе, что в плоскость вбито несколько математических гвоздиков. Движение маятника в этом случае будет более сложным, но, в конце концов, он также начнет совершать некоторые периодические колебания.

Для нашего идеального математического мира считаются выполненными следующие условия:
    гвоздики и нить имеют нулевую толщину;
    энергия маятника не теряется (т.е. трение отсутствует);
    маятник никогда не сталкивается с гвоздиками (с ними входит в соприкосновение только нить);
    нить изгибается только при соприкосновении с гвоздиком.

Ваша задача состоит в том, чтобы промоделировать движение маятника и вычислить длину установившейся орбиты.

Вниманию тех, кто боится физики! Единственный физический факт, необходимый для решения этой задачи, таков: маятник никогда не поднимается выше своей начальной высоты. Следовательно, маятник либо достигнет оси x, либо будет крутиться вокруг некоторого гвоздика.

Входные данные

В первой строке входного файла записаны целое число N – количество гвоздиков (0 ≤ N ≤ 500) и вещественное число r – длина нити. В каждой из следующих N строк через пробел указаны координаты одного из гвоздиков.

Выходные данные

Выведите в выходной файл длину одного цикла периодической орбиты, по которой станет качаться маятник. Учитывать расстояние, пройденное маятником до того, как он вышел на эту орбиту, не нужно. Ответ должен быть указан с точностью до двух знаков после десятичной точки.

Пример входного файла

2 16.0
3 -4
-3 -4

Пример выходного файла

87.66
Прислать комментарий     Решение


Задача 98678

 [Красивые числа]
Тема:   [ Десятичная запись числа ]
Сложность: 4+
Классы: 8,9,10,11

Имя входного файла:

numbers.in

Имя выходного файла:

numbers.out

Максимальное время работы на одном тесте:

1 секунда

Максимальный объем используемой памяти:

64 мегабайта

Максимальная оценка за задачу:

100 баллов

   

Саша считает красивыми числа, десятичная запись которых не содержит других цифр, кроме 0 и k (1 ? k ? 9). Например, если k = 2, то такими числами будут 2, 20, 22, 2002 и т.п. Остальные числа Саше не нравятся, поэтому он представляет их в виде суммы красивых чисел. Например, если k = 3, то число 69 можно представить так: 69 = 33 + 30 + 3 + 3.

Однако, не любое натуральное число можно разложить в сумму красивых целых чисел. Например, при k = 5 число 6 нельзя представить в таком виде. Но если использовать красивые десятичные дроби, то это можно сделать: 6 = 5.5 + 0.5.

Недавно Саша изучил периодические десятичные дроби и начал использовать и их в качестве слагаемых. Например, если k = 3, то число 43 можно разложить так: 43 = 33.(3) + 3.(3) + 3 + 3.(3).

Оказывается, любое натуральное число можно представить в виде суммы положительных красивых чисел. Но такое разложение не единственно - например, число 69 можно также представить и как 69 = 33 + 33 + 3. Сашу заинтересовало, какое минимальное количество слагаемых требуется для представления числа n в виде суммы красивых чисел.

Требуется написать программу, которая для заданных чисел n и k находит разложение числа n в сумму положительных красивых чисел с минимальным количеством слагаемых.

Формат входных данных

Во входном файле записаны два натуральных числа n и k (1 ≤ n ≤ 109; 1≤ k ≤ 9).

Формат выходных данных

В выходной файл выведите разложение числа n в сумму положительных чисел, содержащих только цифры 0 и k, количество слагаемых в котором минимально. Разложение должно быть представлено в виде:

n=a1+a2+...+am

Слагаемые a1, a2, ..., am должны быть выведены без ведущих нулей, без лишних нулей в конце дробной части. Запись каждого слагаемого должна быть такой, что длины периода и предпериода дробной части имеют минимально возможную длину. Например, неправильно выведены числа: 07.7; 2.20; 55.5(5); 0.(66); 7.(0); 7. ; .5; 0.33(03). Их следует выводить так: 7.7; 2.2; 55.(5); 0.(6); 7; 7; 0.5; 0.3(30).

Предпериод и период каждого из выведенных чисел должны состоять не более чем из 100 цифр. Гарантируется, что хотя бы одно такое решение существует. Если искомых решений несколько, выведите любое. Порядок слагаемых может быть произвольным.

Выходной файл не должен содержать пробелов.

Примеры

numbers.in

numbers.out

69 3

69=33+33+3

6 5

6=5.5+0.5

10 9

10=9.(9)

Прислать комментарий     Решение

Страница: << 49 50 51 52 53 54 55 >> [Всего задач: 272]      



© 2004-... МЦНМО (о копирайте)
Пишите нам