Тренировки НГУ по программированию для школьников, 2006 г. Тренировка 05.11.2006 Задачи 1 – 3 могут быть решены исходя из материала лекции и поэтому являются обязательными. Задача 5 предлагалась на летних сборах, задача 6 — на зимних сборах, задача 7 — на РОИ. Задача 1. Лабиринт Вам задан лабиринт в следующем формате: В первой строке входного файла находятся целые числа M и N (1 ≤ M, N ≤ 100) — высота и ширина лабиринта. Каждая из следующих M строк содержит N символов, при этом символ ‘.’ обозначает пустую клетку, символ ‘X’ — блок, символ ‘S’ — начальную клетку, символ ‘F’ — конечную клетку. Выведите в выходной файл минимальное число шагов, за которое можно добраться от начальной клетки до конечной, каждый раз переходя на соседнюю по стороне клетку и не ступая на блоки, либо число -1, если это невозможно. Пример input.txt 6 7 .....X. .X..XF. ..XXXX. .X..... .X..X.. S...X.. output.txt 11 Задача 2. Кратчайшее расстояние-1 Дан взвешенный ориентированный граф с N вершинами и M дугами (1 ≤ N ≤ 1000, 0 ≤ M ≤ 100000). В первой строке входного файла заданы числа N и M. Каждая из следующих M строк содержит тройку целых чисел A B C (1 ≤ A, B ≤ N, A ≠ B, 0 ≤ C ≤ 100), описывающую дугу из вершины A в вершину B веса C (вершины нумеруются начиная с единицы). Требуется в выходной файл вывести N чисел, i-е из которых — длина кратчайшего пути из вершины 1 в вершину i. В графе может быть несколько дуг из одной вершины в другую. Расстояние от вершины до самой себя по определению равно 0. Если до какой-то вершины пути нет, то расстояние полагаем равным -1. Пример input.txt 5 1 1 4 4 2 2 5 7 2 4 3 2 4 3 2 output.txt 0 1 7 4 -1 1 10 7 5 3 6 1 Задача 3. Кратчайшее расстояние-2 Дан взвешенный ориентированный граф с N вершинами и M дугами (1 ≤ N ≤ 100, 0 ≤ M ≤ 100000). В первой строке входного файла заданы числа N и M. Каждая из следующих M строк содержит тройку целых чисел A B C (1 ≤ A, B ≤ N, A ≠ B, -1000 ≤ C ≤ 1000), описывающую дугу из вершины A в вершину B веса C (вершины нумеруются начиная с Страница 1 из 5 Тренировки НГУ по программированию для школьников, 2006 г. Тренировка 05.11.2006 единицы). Требуется в выходной файл вывести N строк по N чисел, j-е число в i-й строке — длина кратчайшего пути из вершины i в вершину j. В графе может быть несколько дуг из одной вершины в другую. Расстояние от вершины до самой себя по определению равно 0. Если до какой-то вершины пути нет, то выведите символ Z. Гарантируется, что в графе нет цикла отрицательной длины. Пример input.txt 5 1 1 4 4 2 2 5 7 2 4 3 2 4 3 2 0 Z Z Z Z 1 -10 7 5 3 6 1 -5 -3 0 6 3 Z 0 Z 5 7 0 1 7 4 output.txt -10 Z Z Z Z 0 Задача 4. Кратчайшее расстояние-3 Дан взвешенный ориентированный граф с N вершинами и M дугами (1 ≤ N ≤ 30000, 0 ≤ M ≤ 100000). В первой строке входного файла заданы числа N и M. Каждая из следующих M строк содержит тройку целых чисел A B C (1 ≤ A, B ≤ N, A ≠ B, 0 ≤ C ≤ 1), описывающую дугу из вершины A в вершину B веса C (вершины нумеруются начиная с единицы). Требуется в выходной файл вывести N чисел, i-е из которых — длина кратчайшего пути из вершины 1 в вершину i. В графе может быть несколько дуг из одной вершины в другую. Расстояние от вершины до самой себя по определению равно 0. Пример input.txt 4 1 1 4 4 2 2 6 2 4 3 2 4 3 output.txt 0 1 1 1 1 1 1 0 0 0 Страница 2 из 5 Тренировки НГУ по программированию для школьников, 2006 г. Тренировка 05.11.2006 Задача 5. Странная игра Витя играет сам с собой в странную игру: он задумывает целые числа N (2 ≤ N ≤ 100000), a и b (0 ≤ a,b < N). После этого, отправляясь от числа a, он хочет получить число b за наименьшее число ходов. За один ход разрешается от числа x перейти к одному из чисел (x + 1) mod N, (x2+1) mod N или (x3+1) mod N. Ваша задача: написать программу, которая определяет искомое наименьшее число ходов. Формат входных данных В первой строке входного файла записаны целые числа N, a и b. Формат выходных данных Если не существует способа получить число b из числа a указанным в условии способом, то в первой строке выходного файла должно располагаться число –1. В противном случае в ней должно быть искомое наименьшее число ходов L. Пример input.txt 7 5 2 output.txt 2 Задача 6. Как Петя учил математику Когда Петя был маленьким, мама купила ему увлекательную книжку по математике. На каждой странице этой книжки было несколько записей вида «знак операции, число, страница, куда перейти». Здесь знак операции — это либо «*» (умножить), либо «/» (разделить). Петя должен был, открыв книжку на соответствующей странице, выбрать любую из записей на этой странице, выполнить с имеющимся у него числом написанную операцию (то есть либюо умножить число на число, которое присутствует в записи, либо разделить), и перейти на указанную в записи страницу. В начале этой игры у Пети есть число один, и он открывает книжку на первой странице. Поскольку в младенческом возрасте Петя еще не очень хорошо умел считать, мама решила помочь Пете и написать на каждой странице минимально возможное число Ai такое, что всегда, когда Петя приходит на страницу номер i, его текущее число не превышает Ai. Тогда если Петя увидит, что у него получилось число большее Ai, он будет знать, что в какой-то момент ошибся, и начнет игру заново. Если в какой-то момент Петя придет на страницу, на которой нет ни одной записи, игра для него закончится. Помогите Петиной маме: напишите программу, которая расставит эти числа за нее. Формат входных данных Первая строка входного файла содержит целое число N — количество страниц в книге (1 N 300). Далее идут описания записей на каждой из страниц. Для каждой страницы сначала указано число записей на ней, а затем идут сами записи. Каждая запись записана на отдельной строке и состоит из знака операции (* или /), числа (число целое, по модулю не превышает 1000) и номера страницы, на которую нужно переходить. Знак операции, число и номер страницы разделены не меньше чем одним пробелом. Операций деления на 0 нет. Общее число операций не превышает 200000. Формат выходных данных В выходной файл выведите N строк. На i-ой строке выведите искомое число Ai для страницы номер i. Число должно быть выведено в экспоненциальной форме. Если числа Ai не существует, выведите сообщение INF, а если Петя никогда не сможет попасть на данную страницу, выведите сообщение NONE. Страница 3 из 5 Тренировки НГУ по программированию для школьников, 2006 г. Тренировка 05.11.2006 Пример input.txt 5 1 * 3 / / * 0 2 / * 1 * 2 2 2 1 2 4 2 4 output.txt 1.00000E+000 2.00000E+000 NONE 4.00000E+000 INF -4 1 -2 5 -2 5 Задача 7. UP Для того, чтобы выдержать собеседование при приеме на работу в качестве программиста в некоторую компьютерную фирму, претендент должен уметь решать задачи по следующим четырем темам: динамическое программирование, перебор с возвратом, теория графов и вычислительная геометрия. Полностью подготовиться к тестовому собеседованию можно, решая задачи из пособия, изданного этой фирмой. Уровень подготовки программиста по каждой из перечисленных тем оценивается своим индексом UP по L-балльной шкале от 1 до L. Для каждой из задач определены минимальные UP программиста по каждой из тем, необходимые для того, чтобы он смог решить данную задачу. Определены также UP, которых программист достигнет, решив ее. Если при этом по какой-то из тем он уже имел более высокий UP, то этот уровень не понизится. На решение задачи, повышающей хотя бы один из UP, программист тратит 2 часа, в противном случае - 1 час. Требуется разработать учебный план, занимаясь по которому не более T часов, начинающий программист (UP=1 по всем темам) достиг бы уровня подготовки L по всем темам, прорешав за это время как можно больше различных задач. Формат входных данных В первой строке входного файла задано число T - количество часов, которыми располагает претендент для подготовки к собеседованию. Во второй строке записано число L (2 ≤ L ≤ 16), а в третьей строке - количество задач M (1 ≤ M ≤ 500, 2 ≤ T ≤ M). Каждая из последующих M строк содержит 8 чисел, описывающих одну из задач. Первые четыре числа определяют UP претендента по всем темам, необходимые для того, чтобы он мог решить эту задачу. Следующие четыре числа задают UP, до которых в результате решения этой задачи повысятся те уровни подготовки претендента, которые были ниже. Формат выходных данных При возможности достижения уровня подготовки L по всем темам в выходной файл вывести сначала максимальное количество задач в учебном плане, а затем последовательность номеров задач, которые должен решить претендент. Задачи нумеруются в том порядке, в каком они описаны во входном файле, ни одна задача не может быть указана более одного раза. Если с помощью указанного во входном файле набора задач за время T начинающий программист не сможет достигнуть UP, равного L по всем темам, вывести в выходной файл одно число 0. Страница 4 из 5 Тренировки НГУ по программированию для школьников, 2006 г. Тренировка 05.11.2006 Пример input.txt 7 5 6 2 1 3 1 2 1 output.txt 4 2 1 4 3 1 1 3 3 2 2 1 1 3 1 2 3 1 1 3 1 2 4 2 3 3 5 2 2 4 1 3 5 2 3 5 1 3 5 2 4 5 1 3 5 2 5 Страница 5 из 5