В парке есть аттракцион, ... павильонов, и они соединяются мостиками. ... Олимпиада по информатике

advertisement
Олимпиада по информатике
1 задание (30 баллов).
В парке есть аттракцион, который называется «Семь островов». Там расположено семь
павильонов, и они соединяются мостиками. Из первого павильона есть мост в третий
павильон. Из второго – в четвёртый и шестой павильоны. Из третьего – в пятый и шестой. Из
четвёртого – в седьмой. Из пятого – в седьмой. Определите самую короткую дорогу из
пятого павильона в четвёртый павильон? Реализуйте решение задачи на одном из языков
программирования.
Решение:
Рисуется граф, и по нему определяется самый короткий путь, из предложенных вариантов.
Указания для составления программы
Для решения задачи необходимо построить граф и реализовать метод обхода графа в
ширину, который осуществляет по-уровневое исследование графа: вначале посещается
заданная вершина, затем – все потомки данной вершины, потом посещаются потомки
потомков и т.д.
Алгоритм обхода графа в ширину заключается в следующем:
Пусть задан граф G=(V – количество вершин, E – количество ребер) и вершина s, с которой
начинается обход. После посещения вершины s, следующими за ним будут посещены
смежные вершины с s, которые обозначаются как q, q – некоторое подмножество V.Далее,
эта процедура повториться для вершин смежных с вершинами из множества q, за
исключением вершины s, т. к. она уже была посещена. Так, продолжая обходить уровень за
уровнем, алгоритм обойдет все доступные из s вершины множества V. Алгоритм прекращает
свою работу после обхода всех вершин графа, либо в случае выполнения наличествующего
условия.
Обход в ширину выполняется с помощью такой структуры данных, как очередь, которая
представляет собой массив чисел, доступ к которым осуществляется по принципу:
добавление элемента возможно только в конец очереди, выборка – только из начала очереди,
при этом выбранный элемент из очереди удаляется. При добавлении элемента в очередь он
записывается в ячейку q[end], а end уменьшаем на 1 (чтобы в дальнейшем добавлять в
очередь). Соответственно, извлечение элемента происходит из q[start], а start уменьшается на
1. Совпадение end и start говорит о том, что очередь пуста.
Формальное описание алгоритма:
-1-
Основные объекты – матрица смежности (список смежности), очередь и массив посещенных
вершин – pos_verschiny.
Первые два объекта имеют целочисленный тип данных, третья – логический. Посещенные
вершины, помещаются в массив pos_verschiny, что предотвращает зацикливание, очередь
будет содержать задействованные вершины.
Рассмотрим разбитый на этапы процесс обхода графа:
1. Массив pos_verschinyобнуляется, т. е. ни одна вершина графа еще не была посещена;
2. в качестве стартовой, выбирается некоторая вершина s и помещается в очередь (в
массив queue);
3. вершина s исследуется (помечается как посещенная), и все смежные с ней вершины
помещаются в конец очереди, а сама она удаляется;
4. если на данном этапе очередь оказывается пустой, то алгоритм прекращает свою
работу; иначе посещается вершина, стоящая в начале очереди, помечается как
посещенная, и все ее потомки заносятся в конец очереди;
5. пункт 4 выполняется пока это возможно.
Поиск в ширину, начиная со стартовой вершины, постепенно уходит от нее все дальше и
дальше, проходя уровень за уровнем. Получается, что по окончанию работы алгоритма будут
найдены все кратчайшие пути из начальной вершины до каждого доступного из нее узла.
Для реализации алгоритма на языке программирования потребуется: умение программно
задавать граф, а также иметь представление о такой структуре данных, как очередь.
В том случае, если граф задан матрицей смежности, то время, затраченное на ее обход,
оценивается в O(|V|2). В том случае, граф задан списком смежности, то время, затраченное на
его обход, оценивается в O(|V|+|E|).
В программе матрица смежности задается при помощи обычного двумерного массива,
имеющего размерность n×n, где n – число вершин графа, списки смежности представляются
как массив списков - std::vector<std::list> v;.
Список v[i] хранит смежные вершины с v (к которым есть ребро). Строить его просто, если
матрица смежности (например, и 0, и 1, где 0 - отсутствие ребра, 1 - наличие) и в a[i,j] стоит
1, то добавляете j в список v[i]. Степень вершины – количество смежных вершин. Степень
вершины i - длина списка v[i]. Для перебора смежных вершин необходимо пройти по всем
элементам списка v[i].
2 задание (10 баллов).
У тебя на дне рождения собрались друзья – всего шесть человек. Вы сидите вокруг стола.
Каждой девочке мама положила в сюрприз по три конфеты. А каждому мальчику – столько
конфет, сколько у него соседей-девочек. Как расположились дети за столом, если в
сюрпризах прячутся 13 конфет. Ответ обоснуйте.
Решение:
Пусть на дне рождении будет присутствовать одна девочка, тогда на мальчиков (5 человек)
приходится 10 конфет, что противоречит условию задачи.
Пусть на дне рождении будет присутствовать две девочки, тогда на мальчиков (4 человека)
приходится 7 конфет, что тоже противоречит условию.
Пусть на дне рождении будет присутствовать три девочки, тогда на мальчиков (3 мальчика)
приходится 4 конфеты. Следовательно, один из мальчиков должен сидеть между девочками,
и ему должно достаться 2 конфеты, два мальчика должны сидеть рядом и получить по одной
конфете.
-2-
Ответ: ДМДДММ
3 задание (2 балла).
Учительница попросила описать ЯБЛОКО, используя информацию разных видов. Ты сказал:
«Румяное яблоко». Твой друг сказал: «Ароматное яблоко». Другие ребята сказали:
«Хрустящее яблоко», «Кисло-сладкое яблоко», «Крупное яблоко». Какой вид информации
был назван два раза? Ответ поясните.
Решение:
Для каждого словосочетания определим вид информации: “Румяное яблоко” – зрительная
информация, мы видим внешний вид яблока, “Ароматное яблоко” – обонятельная
информация, аромат яблока улавливается носом, “Хрустящее яблоко” – звуковая
информация, хруст яблока мы слышим, “Кисло-сладкое яблоко” – вкусовая информация,
вкус яблока мы ощущаем, “Крупное яблоко” – зрительная, размер яблока определяется на
глаз.
Ответ: зрительная информация.
4 задание (10 баллов)
Внимательно посмотрите на следующие действия. На первый взгляд они Вам покажутся
странными. Ваша задача определить, какие именно числа здесь зашифрованы? Помните, что
зашифрованные цифры записаны в десятичной системе счисления.
Решение:
Из второго примера мы видим, что результат и второе слагаемое одинаковы, значит,
число из которого вычитаем должно быть в два раза больше вычитаемого. Предположим, что
x – капля, y – елка, z – снежинка. X, y, z – не должны быть больше 9, и меньше 2. Так как
результат должен быть в два раза меньше первого слагаемого, то делаем вывод, что цифры
первого слагаемого должны быть четными и принимать значение 2, 4, 6, 8. Так как вторая
цифра первого слагаемого равна третьей цифре второго слагаемого, то делаем вывод, что
елка не может принимать значения 8 и 6. (их сумма будет больше 10). А огонь может
принимать значения либо 1, 2 (выше будет означать, что елка должна быть равна 6 или 8,
однако этого как мы установили быть не может). Капля аналогично елке может принимать
значения 2 , 4, 6, 8.
Далее обращаем внимание на 1 задачу. И из нее мы видим, что произведение елки
должно равняться снежинки, или математически это будет выглядеть так: x*x=x+x=y. Как
мы видим такое возможно только если x=2, то есть елка = 2.
Возвращаемся ко второму примеру. Так как елка равна =2, а огонь половине от елки, то
делаем вывод что огонь =1. Снежинка равна двум елкам следовательно = 4. Так как 1, 2 и 4
найдено, то делаем вывод что капля теперь может принимать значения либо 6, либо 8.
Однако если это будет 8, то молния будет равна =4, но четыре мы уже нашли, следовательно
капля равна 6.
-3-
Далее снова переходим в первый пример и подставляем найденные значения в
произведение и второй множитель. Делим произведение на второй множитель получаем
624/12=52. Делаем вывод, что молния это 5.
Переходим к третьему примеру, подставляем найденные значения и получаем, что
бабочка равна 7.
Переходим к последнему примеру. У нас осталось только два числа 8 и 9. Если
разделить число 774 на 8 получаем 89 и 62 в остатке. Все сходится.
774 8
52
624
312




712 89
12
312
462
1)
; 2)
; 3)
; 4)
624
312
774
62
Ответ:
1 – огонь
2 – елка
3 – волна
4 – снежинка
5 – молния
6 – капля
7 – бабочка
8 – цветок
9 – облачко
5 задание (8 баллов).
В зоопарке 32 обезьяны живут в двух вольерах, А и Б. Одна из обезьян – альбинос.
Сообщение “Обезьяна-альбинос живет в вольере А” содержит 4 бита информации.
Определить, используя формулу Шеннона, сколько обезьян живут в вольере Б?
Решение:
1. Определяем вероятность того, что обезьяна-альбинос живет в вольере А, используя
формулу Шеннона, т.е. pi = 1/16;
2. В соответствии с примечанием получаем, что в вольере А живет 2 обезьяны,
1
т.к. 32   2 .
16
3. В вольере Б живет 30 обезьян, т.к. 32-2 = 30.
6 задание (15 баллов).
Мы предлагаем вам стихотворение, написанное в 60-х годах программистом Марковым С.А.,
в котором необходимо подсчитать количество слов, связанных с синтаксисом языка
программирования (зарезервированные слова, названия операторов, типы величин и т.п.)
Начало светлое весны
Лесов зеленые массивы
Цветут. И липы, и осины
И ели помыслы ясны.
Себе присвоил этот май
Права одеть листвою ветки,
И целый месяц в душе метки
Он расставляет невзначай...
И пишется легко строка,
И на этюдник рвутся кисти,
Уходит ложь в обличье истин,
И говорю я ей: пока!
-4-
Решение:
Начало – begin
Массивы – array
И – and
Ясный – clear
Присвоил - :=
В – in
Метки – label
Писать – write
Ответ: 15 слов.
Строка – string
Ложь – false
Истина – True
Пока - While
Уходит – go
Рвутся - Break
Целый - Integer
7 задание (5 баллов).
При обработке массива из нулей и единиц 10100110 был применен следующий алгоритм:
если первый элемент массива единица, то переносим ее на третью с конца позицию, а если
первый элемент массива нуль, то меняем местами первые два элемента массива.
Запишите последовательность, получившуюся после пятикратного применения этого
алгоритма. Составьте программу на одном из языков программировании, реализующую
решение задачи.
Решение:
Пусть дана последовательность 10100110, тогда при первом проходе будет получена
последовательность, состоящая из следующих символов: 01001110, при втором – 10001110,
при третьем и четвертом и пятом проходе будет получена одна и та же последовательность
символов – 00011110.
Ответ: 00011110
Указания для составления программы
Для решения задачи необходимо реализовать ввод данных в массив, затем осуществить
проверку первого элемента массива. В том случае, если массив имеет первым элементом
символ “1”, то необходимо переписать массив, кроме двух последних элементов, сдвинув его
на один элемент, и записав первый элемент на третье место с конца. В том случае, если
первый элемент равен “0”, то поменять местами первый и второй элемент. Проверку
элементов в массиве необходимо осуществлять в цикле (пять итераций).
Здесь список v[i] хранит смежные вершины с v (к которым есть ребро). Строить его просто,
если матрица смежности (например и 0 и 1, где 0 - отсутствие ребра, 1 - наличие) и в a[i,j]
стоит
1,
то
добавляете
j
в
список
v[i].
Степень вершины - кол-во смежных вершин, считать просто. Степень вершины i - длина
списка
v[i].
Перебирать смежные для вершины i - просто проходите по всем элементам списка v[i]
Обход в ширину(дерева и графа) происходит по уровням: сначала посещается вершина
уровня 0 (заданная начальная вершина обходаvn), затем вершины уровня 1, находящиеся на
расстоянии в 1 шаг от начальной вершины, затем – вершины уровня 2, расположенные на 2
шага от начала обхода, т. е. на 1 шаг от вершин уровня 1 и т. д. Уровень i+1 включает
преемников вершин уровня i (рис. 22.1).
Обход в ширину выполняется с помощью очереди вершин на посещение. Из головы очереди
выбирается и посещается вершина, а ее преемники заносятся в хвост очереди.
Пока из очереди выбираются и посещаются все вершины уровня i, за ними в очереди
расположатся все вершины уровняi+1. Первоначально в очередь помещается единственная
-5-
вершина уровня 0. В дереве это корень, а в графе - заданная начальная вершина обходаvn. На
удивление простой и изящный алгоритм!
Оценивание:
Задача считается решенной, если правильно дан ответ и составлена программа на одном из
языков программирования, реализующая вывод правильной последовательности: 10100110,
1100110, 0011010.
Для последовательности: 10100110 – 00011110, 1100110 – 0011110, 0011010 – 0011010.
8 задание (3 балла).
Укажите маску (шаблон), позволяющую правильно объединить в одну группу все файлы, в
имени и расширении которых есть символ «G», а расширение начинается с символа «F».
Пример записи маски (шаблона) файла: ??A*.B?
Решение:
1. Определяем, что в маске необходимо использовать символ “*”, т.к. нет четкого
ограничения на количество символов и в имени файла, и в расширении.
2. Рассмотрим отдельно имя файла и расширение.
a. Имя файла: символ “G” должен находиться в середине имени файла, исходя из
условия задачи, следовательно, для имени файла маска может быть
следующей: *G*ж;
b. Расширение: расширение должно начинаться с символа “F” и иметь
обязательно символ “G”. При этом количество символов в расширении
неограниченно. Следовательно, маска будет иметь следующий вид: F*G*.
Ответ: *G*.F*G*.
9 задание (5 баллов).
Молодой стажер технического отдела Васечкин получил свое первое самостоятельное
задание: установить на новый компьютер директора драйвера от периферийных устройств.
Отправляясь на свое задание, Васечкин получил от своих более опытных коллег по работе
напутствие, в каком порядке нужно устанавливать драйвера. Но коллеги были с чувством
юмора и решили дать советы, в которых лишь половина является правдой, а остальное
сознательной ложью.
Помощник мастера: Первым можно установить только сканер, а внешний жесткий диск –
предпоследним.
Диспетчер: Монитор устанавливай обязательно вторым, а четвертым – внешний жесткий
диск.
Начальник отдела: Монитор необходимо устанавливать вторым, а сканер только третьим.
Старший мастер: Никогда не ставь третьим принтер, не нужно ставить последней
музыкальную клавиатуру.
Младший мастер: Музыкальную клавиатуру можно поставить самой первой, а вторым –
принтер.
Помогите Васечкину восстановить точную последовательность установки драйверов. В
ответе укажите подряд первые буквы устройств в том порядке, в котором необходимо
устанавливать для них драйвера. (В – внешний жесткий диск, К – музыкальная клавиатура,
М – монитор, П – принтер, С – сканер). Решение обоснуйте.
Решение:
-6-
Пусть помощник мастера сказал про внешний жесткий диск неправду, тогда правдой будет
являться, что первым необходимо установить драйвер сканера. Следовательно, исходя из
слов, диспетчера получается, что вторым необходимо устанавливать монитор, что
однозначно показывает, что младший мастер два раза сказал неправду, что противоречит
условию задачи.
Пусть помощник мастера сказал про сканер неправду, тогда правдой будет являть
утверждение, что четвертым необходимо будет установить внешний жесткий диск. Тогда
диспетчер сказал неправду о драйвере монитора, что его необходимо устанавливать вторым,
следовательно, начальник отдела сказал правду о драйвере сканера, что его необходимо
установить третьим. Исходя из этого, следует, что старший мастер сказал правду о том, что
третьим не надо устанавливать сканер принтера, что означает, что он сказал правду, что
пятым устанавливается драйвер музыкальной клавиатуры. Остается, что драйвер монитора
устанавливается первым, т.е. правильной последовательность будет являться: МПСВК.
Ответ: МПСВК
-7-
Download