Дистанционные семинары




Скачать 0.69 Mb.
страница 3/7
Дата 31.08.2016
Размер 0.69 Mb.
1   2   3   4   5   6   7

Формат входных данных
Первая строка входного файла содержит заданный шаблон длиной не более 80 символов.

Формат выходных данных
Выведите в выходной файл искомое количество способов. Исходные данные будут таковы, что это количество не превзойдет 2*10^9.

Пример

input.txt

output.txt

????(?

2

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

Будем решать задачу нахождения количества скобочных последовательностей, удовлетворяющих первым k символам шаблона, у которых баланс всегда неотрицателен и в конце равен m (обозначим количество таких последовательностей ak,m). Есть два варианта: либо на k-м месте стоит открывающаяся скобка, тогда последовательность из k-1 скобки (без последней) должна иметь баланс m-1 - таких последовательностей ak-1,m-1, либо закрывающаяся - тогда, наоборот, баланс последовательности без последней скобки равен m+1 - таких последовательностей ak-1,m+1. В зависимости от шаблона и баланса возможны один, два (если в шаблоне стоит на этом месте ?) или ноль из этих вариантов. ak,m равно их сумме. Ответ на поставленную задачу будет в an,0.

Нужно отметить одну тонкость. В условии сказано, что окончательный ответ входит в стандартный тип longint, но не сказано, что все промежуточные вычисления укладываются в longint. Однако, если в ходе вычислений мы получили какое-то большое число, то оно не может влиять на окончательный ответ (так как при вычислении ответа используется только сумма). Значит, это число можно либо вообще не вычислять, либо вычислить с ошибками. На окончательный результат это не повлияет.

Задача 03-2. Шаблон и слово



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

input.txt

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

output.txt

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

3 секунды

Будем рассматривать слова из больших латинских букв и шаблоны, состоящие из больших латинских букв и символов "?" и "*". Говорят, что слово подходит под шаблон, если в шаблоне можно заменить каждый символ "?" на большую латинскую букву, а каждый символ "*" - на последовательность (возможно, пустую) больших латинских букв, так, чтобы получилось требуемое слово. Напишите программу, которая определит, подходит ли слово под шаблон.

Формат входных данных
В первых двух строках записаны шаблон и слово: в одной строке записан шаблон - последовательность больших латинских букв, "?" и "*", в другой - слово, состоящее только из больших латинских букв (строки короче 256 символов).

Формат выходных данных
Вывести YES, если слово подходит или NO, если нет.

Пример

input.txt

output.txt

ABBCDA

A*CDA


YES

Для начала определим, какая из введенных строк является словом, а какая - шаблоном. Та строка, в которой есть символы '?' или '*' - шаблон. Если ни в одной из строк их нет, то в качестве шаблона возьмем произвольную. Будем определять, может ли часть слова (обозначим s1)с 1-го по k-й символ соответствовать части шаблона (обозначим s2)с 1-го по m-й символ (обозначим ak,m). Теперь есть 3 варианта:

  • В шаблоне на m-м месте стоит буква. Тогда она соответствует последней букве слова и ak,m=(s1[k]=s2[m]) and ak-1,m-1

  • В шаблоне на последнем месте стоит '?'. Тогда он соответствует последней букве слова и ak,m=ak-1,m-1

  • В шаблоне на последнем месте стоит '*'. Тогда возможны два варианта: либо этой звездочке соответсвует пустая последовательность букв слова, либо непустая. Во втором случае в части слова с 1-го по k-1-й символ этой звездочке тоже соответствует некоторая последовательность букв (возможно пустая). Таким образом ak,m=ak-1,m or ak,m-1.

Осталось рассмотреть несколько моментов. Так как '*' может соответствовать пустая последовательность букв, то непустому шаблону вполне может соответствовать пустое слово, значит матрица a должна индексироваться не от 1, а от 0. Если же один из индексов отрицательный - то это всегда FALSE.

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

Занятие 4. Графы - введение.

Граф - это абстрактный математический объект. Он состоит из вершин и ребер. Каждое ребро соединяет пару вершин. Если одну и ту же пару вершин соединяют несколько ребер, то эти ребра называются кратными. Ребро, соединяющее вершину с ней самой, называется петлей. По ребрам графа можно ходить, перемещаясь из одной вершины в другую. В зависимости от того, можно ли по ребру ходить в обе стороны, или только в одну, различают неориентированные и ориентированные графы соответсвенно. Ориентированные ребра называются дугами. Если у всех ребер графа есть вес (т.е. некоторое число, однозначно соответсвующее данному ребру), то граф называется взвешенным. Вершины, соединенные ребром, называются соседними. Для неориентированного графа степень вершины - число входящих в нее ребер. Для ориентриованного графа различают степень по входящим и степень по исходящим ребрам. Граф называется полным, если между любой парой различных вершин есть ребро.

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

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

Есть несколько способов представления графа в памяти компьютера. На этом занятии мы рассмотрим некоторые из них.



Способ первый: массив ребер.
Пусть в графе M ребер. Заведем массив размером Mx2, в котором будем хранить ребра парами вершин, которые они соединяют. Это наиболее понятный, но достаточно неудобный способ хранения графа. Однако у него есть один большой плюс - при таком способе представления легко вводить дополнительные характеристики ребер. Например, чтобы сохранить веса ребер, достаточно сделать массив размером Mx3 и в дополнительную ячейку для каждого ребра записать его вес.

Способ второй: матрица смежности.
Пусть в графе N вершин. Заведем матрицу размером NxN, где в элемент ai,j запишем количество ребер из вершины i в вершину j. Если граф взвешенный, то вместо количества запишем вес соответствующего ребра. В случае отсутствия ребра запишем бесконечность. Таким образом, проявился один из недостатков такого представления: в матрице смежности невозможно хранить взвешенный граф с кратными ребрами. Однако, в некоторых случаях, это можно обойти. Очень часто из всего множества ребер между данной парой вершин нам достаточно хранить только одно - самое легкое.
Рассмотрим несколько свойств матрицы смежности.

  • В матрице смежности графа без петель на главной диагонали стоят 0.

  • Матрица смежности неориентированного графа симметрична относительно главной диагонали.

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

Примечание. Формальное определение графа.
Граф - множество V вершин и набор набор E неупорядоченных и упорядоченных пар вершин; обозначается граф через G(V,E).
[Математическая энциклопедия, том 1, Москва, "Советская энциклопедия", 1977]

Задача 04-1. Города и дороги



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

input.txt

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

output.txt

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

5 секунд

В галактике "Milky Way" на планете "Neptune" есть N городов, некоторые из которых соединены дорогами. Император "Maximus" галактики "Milky Way" решил провести инвентаризацию дорог на планете "Neptune". Но, как оказалось, он не силен в математике, поэтому он просит вас сосчитать количество дорог.

Формат входных данных
В файле INPUT.TXT записано число N (0 <= N <= 100). В следующих N строках записано по N чисел, каждое из которых является единичкой или ноликом. Причем, если в позиции (i,j) квадратной матрицы стоит единичка, то i-ый и j-ый города соединены дорогами, а если нолик, то не соединены.

Формат выходных данных
В файл OUTPUT.TXT вывести одно число - количество дорог на планете "Neptune".

Пример

input.txt

output.txt

5

0 1 0 0 0

1 0 1 1 0

0 1 0 0 0

0 1 0 0 0

0 0 0 0 0



3

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

Задача 04-2. Светофорчики



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

input.txt

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

output.txt

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

5 секунд

В подземелье M тоннелей и N перекрестков, каждый тоннель соединяет какие-то два перекрестка. Мышиный король решил поставить по светофору в каждом тоннеле перед каждым перекрестком. Напишите программу, которая посчитает, сколько светофоров должно быть установлено на каждом из перекрестков. Перекрестки пронумерованы числами от 1 до N.

Формат входных данных
В файле INPUT.TXT записано два числа N и M (0 < N <= 100, 0 <= M <= N*(N-1)/2). В следующих M строках записаны по два числа i и j (1 <= i,j <= N), которые означают, что перекрестки i и j соединены тоннелем.

Формат выходных данных
В файл OUTPUT.TXT вывести N чисел: k-ое число означает количество светофоров на k-ом перекрестке.

Примечание Можно считать, что любые два перекрестка соединены не более, чем одним тоннелем. Нет тоннелей от перекрестка i до него самого.

Пример

input.txt

output.txt

7 10

5 1


3 2

7 1


5 2

7 4


6 5

6 4


7 5

2 1


5 3

3 3 2 2 5 2 3

Нам требуется посчитать степени всех вершин. Эта задача не должна вызывать больших трудностей. Попробуйте при реализации этой задачи построить в памяти матрицу смежности графа (хотя задачу можно легко решить и без этого, но умение преобразовывать список ребер к матрице смежности и обратно нам пригодится в дальнейшем).

Задача 04-3. Цветной дождь



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

input.txt

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

output.txt

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

5 секунд

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

Формат входных данных
В файле INPUT.TXT в первой строке записано N (0 < N <= 100) - число холмов. Далее идет матрица смежности, описывающая наличие мостов между холмами (1-мост есть, 0-нет). В последней строке записано N чисел, обозначающих цвет холмов: 1 - красный; 2 - синий; 3 - зеленый.

Формат выходных данных
В файл OUTPUT.TXT вывести количество "плохих" мостов.

Пример

input.txt

output.txt

7

0 1 0 0 0 1 1

1 0 1 0 0 0 0

0 1 0 0 1 1 0

0 0 0 0 0 0 0

0 0 1 0 0 1 0

1 0 1 0 1 0 0

1 0 0 0 0 0 0


1 1 1 1 1 3 3

4

Переберем все пары холмов. Если данная пара холмов соединена мостом и покрашена в разные цвета, увеличиваем ответ на 1.

Задача 04-4. Издевательство



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

input.txt

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

output.txt

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

5 секунд

Штирлиц ехал на машине, увидел голосующего Бормана, и проехал мимо. Через некоторое время он снова увидел голосующего Бормана, и снова проехал мимо. Вскоре он опять увидел голосующего Бормана.
 - Издевается! - подумал Борман.
 - Кольцевая! - догадался Штирлиц.

В городе N площадей. Любые две площади соединены между собой ровно одной дорогой с двусторонним движением. В этом городе живет Штирлиц. У Штирлица есть хобби - он любит воскресным утром выйти из дома, сесть в машину, выбрать какой-нибудь кольцевой маршрут, проходящий ровно по трем площадям (то есть сначала он едет с какой-то площади на какую-то другую, потом - на третью, затем возвращается на начальную, и опять едет по этому маршруту). Он воображает, что где-то на этом пути стоит Борман. И так вот ездит Штирлиц все воскресенье, пока голова не закружится, и радуется...

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

Формат входных данных
Во входном файле INPUT.TXT записано сначала число N (3 <= N <= 100), а затем матрица NxN расстояний между площадями (число в позиции i,j обозначает длину дороги, соединяющей i-ую и j-ую площади). Все числа в матрице (кроме стоящих на главной диагонали) - натуральные, не превышающие 1000. Матрица симметрична относительно главной диагонали, на главной диагонали стоят 0.

Формат выходных данных
В выходной файл OUTPUT.TXT выведите номера площадей в оптимальном маршруте. Если маршрутов несколько, выведите любой из них.

Пример


input.txt

output.txt

5

0 20 10 30 40

20 0 30 1 2

10 30 0 40 1000

30 1 40 0 21

40 2 1000 21 0



4 5 2

Нам требуется найти цикл длины 3 минимального веса в полном взвешенном графе. Переберем всевозможные тройки вершин (это можно сделать, например, тремя вложенными циклами - каждая из переменных цикла соответствует какой-то из трех искомых вершин). Любая тройка однозначно задает цикл длины три. Выберем тройку, для которой вес соответсвующего цикла минимален.

Занятие 5. Графы: поиск кратчайшего пути, обход в ширину.



Путь в графе между парой вершин V и U - это последовательность вершин Li (0 <= i <= k), удовлетворяющих условиям:
 1) L0=V
 2) Lk=U
 3) для любого i (0 <= i <= k-1) вершины Li и Li+1 соединены ребром.

Пусть дан невзвешенный граф с N вершинами и M ребрами. Требуется найти кратчайший путь между двумя вершинами. Под кратчайшим расстоянием в невзвешенном графе понимается минимально возможное число ребер в пути между парой вершин.

Будем решать чуть более общую задачу: искать кратчайшее расстояние от начальной вершины до всех остальных. Рассмотрим два способа ее решения.

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

В начале работы алгоритма нам известна только длина пути до начальной вершины, она равна 0. Рассмотрим все вершины, соседние с начальной, расстояние до каждой из них равно 1. Рассмотрим все вершины, являющиеся соседями для вершин, расстояния от начальной вершины до которых равно 1. Если расстояние до такой вершины еще не посчитано, то оно равно 2, и так далее. Таким образом, на k-ом шаге мы находим все вершины, расстояние до которых равно k-1: найдя такую вершину, перебираем все соседние с ней вершины, и, если расстояние до нее еще не посчитано, то оно равно k. Если на некотором шаге мы не изменили ни одного числа в массиве - длины всех путей найдены. Заметим, что кратчайший путь до вершины не может иметь длину больше, чем N-1.



Поиск в ширину
Заметим недостаток предыдущего алгоритма: чтобы на k-том шаге найти вершины, расстояние до которых равно k-1, нужно просмотреть все вершины. Попытаемся исправить этот недостаток.

Заведем очередь. Вероятно, что в жизни очередь видели все. По мере поступления, объекты помещаются в очередь. Когда "продавец" очереди освобождается, он извлекает из очереди следующий элемент и "обслуживает" его. Очередь часто удобно реализовывать с помощью массива и двух указателей - на первый "необслуженный" элемент, и первый свободный элемент массива. Тогда добавление элемента в очередь выглядит так: помещаем его в элемент массива, на который указывает 2-й указатель, с увеличиваем этот указатель на 1. Извлечение из очереди столь же просто: берем элемент, на который указывает 1-й указатель, и указатель увеличиваем на 1.

Вернемся к поиску длин кратчайших путей. Изначально поместим в очередь один элемент - начальную вершину. До нее расстояние известно и равно 0. На каждом шаге алгоритма извлекаем из очереди одну вершину (пусть это вершина v и до нее расстояние k). Затем пербираем всех соседей данной вершины, расстояние до которых еще не известно и добавляем их в очередь. Расстояние до них записываем k+1. Алгоритм заканчивается, когда очередь опустеет. Этот алгоритм работает быстрее предыдущего. Время работы алгоритма зависит от конкретной реализации. Обычно алгоритм выполняет порядка N2 или M действий.

Восстановление пути
Пусть мы знаем кратчайшие расстояния до всех вершин. Как найти кратчайший путь до конкретной вершины? Рассмотрим эту вершину (обозначим ее V). Пусть длина пути до нее L. Эта вершина является последней в пути к V. Найдем какую-нибудь вершину, которая соединена с V, и расстояние до которой равно L-1. Тогда эта вершина является предпоследней в пути (если таких вершин несколько, значит существует несколько кратчайших путей и можно выбрать любую из этих вершин). Далее найдем вершину, которая соединена с предпоследней и расстояние до которой равно L-2. Она является пред-предпоследней. Продолжая этот процесс мы можем "раскрутить" весь путь задом наперед. Осталось только запомнить его в массиве и вывести в правильном порядке.

Задача 05-1. Путь



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

input.txt

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

output.txt

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

5 секунд

В неориентированном графе требуется найти минимальный путь между двумя вершинами.

Формат входных данных
Во входном файле записано сначала число N - количество вершин в графе (1<=N<=100). Затем записана матрица смежности (0 обозначает отсутствие ребра, 1 - наличие ребра). Затем записаны номера двух вершин - начальной и конечной.

Формат выходных данных
В выходной файл выведите сначала L - длину кратчайшего пути (количество ребер, которые нужно пройти), а затем L+1 число - путь от одной вершины до другой, заданный своими вершинами. Если пути не существует, выведите одно число -1.

Пример

input.txt

output.txt

5

0 1 0 0 1

1 0 1 0 0

0 1 0 0 0

0 0 0 0 0

1 0 0 0 0

3 5


3

3 2 1 5


Необходимо применить алгоритм поиска в ширину или волновой алгоритм и вывести ответ.

Задача 05-2. Один конь



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

input.txt

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

output.txt

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

3 секунд

На шахматной доске NxN в клетке (x1,y1) стоит голодный шахматный конь. Он хочет попасть в клетку (x2,y2), где растет вкусная шахматная трава. Какое наименьшее количество ходов он должен для этого сделать?
1   2   3   4   5   6   7


База данных защищена авторским правом ©infoeto.ru 2022
обратиться к администрации
Как написать курсовую работу | Как написать хороший реферат
    Главная страница