Решения олимпиадных задач xv городской олимпиады...

8
XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/ Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ Решения олимпиадных задач Теоретический тур (6 задач) Задача 1. “Сумма кодов”. Выбрать слово, имеющее наименьшую сумму кодов символов в таблице кодировки ASCII (ис- пользуются строчные буквы). Ответ обоснуйте. beer bear type deer hair Как известно, в таблице кодировки ASCII английские буквы следуют в алфавитном порядке. Поэтому каждой букве, вместо кода ASCII, можно сопоставить ее алфавитный номер, номера букв суммировать и суммы сравнивать. Получается, что наименьшую сумму кодов символов имеет слово «bear» (2+5+1+18). Задача 2. “Два берега”. К реке подошли два мальчика и один взрослый. У берега они увидели маленькую лодку, вме- щавшую либо двух мальчиков, либо одного взрослого. Какое минимальное время требуется на пе- реправу, если каждая поездка через реку (в одну сторону) занимает 20 минут? Ответ обоснуйте. Потребуется 5 переправ, то есть 100 минут, то есть 1 час 40 мин. Переправы такие: 2 мальчика, обратно 1 мальчик, туда 1 взрослый, обратно 1 мальчик, туда 2 мальчика. Для доказательства, что этот алгоритм оптимален, необходимо перебрать все возможные варианты из 5 шагов. Вариантов много, но лишь один из них решает задачу. Задача 3. “Приветствие племен”. Алфавит одного племени состоит из Х символов, алфавит другого содержит в четыре раза больше символов. Племена обменялись приветствиями. Каждое по 100 символов. На сколько бит информации одно приветствие больше другого? Ответ обоснуйте. На 200 бит. Обозначим за N количество букв в первом алфавите. Тогда каждая буква сообще- ния будет нести log 2 N бит информации. Во втором алфавите 4*N букв и log 2 (4*N) бит на букву. Тогда разность количеств информации в сообщениях: 100*log 2 (4*N) - 100*log 2 N = 100*(2+ log 2 N) - 100*log 2 N = 100*2 = 200.

Upload: dinhnhu

Post on 08-Dec-2016

217 views

Category:

Documents


1 download

TRANSCRIPT

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

Решения олимпиадных задач Теоретический тур (6 задач)

Задача 1. “Сумма кодов”. Выбрать слово, имеющее наименьшую сумму кодов символов в таблице кодировки ASCII (ис-

пользуются строчные буквы). Ответ обоснуйте. beer bear type deer hair Как известно, в таблице кодировки ASCII английские буквы следуют в алфавитном порядке.

Поэтому каждой букве, вместо кода ASCII, можно сопоставить ее алфавитный номер, номера букв суммировать и суммы сравнивать. Получается, что наименьшую сумму кодов символов имеет слово «bear» (2+5+1+18).

Задача 2. “Два берега”. К реке подошли два мальчика и один взрослый. У берега они увидели маленькую лодку, вме-

щавшую либо двух мальчиков, либо одного взрослого. Какое минимальное время требуется на пе-реправу, если каждая поездка через реку (в одну сторону) занимает 20 минут? Ответ обоснуйте.

Потребуется 5 переправ, то есть 100 минут, то есть 1 час 40 мин. Переправы такие: 2 мальчика,

обратно 1 мальчик, туда 1 взрослый, обратно 1 мальчик, туда 2 мальчика. Для доказательства, что этот алгоритм оптимален, необходимо перебрать все возможные варианты из 5 шагов. Вариантов много, но лишь один из них решает задачу.

Задача 3. “Приветствие племен”. Алфавит одного племени состоит из Х символов, алфавит другого содержит в четыре раза

больше символов. Племена обменялись приветствиями. Каждое по 100 символов. На сколько бит информации одно приветствие больше другого? Ответ обоснуйте.

На 200 бит. Обозначим за N количество букв в первом алфавите. Тогда каждая буква сообще-

ния будет нести log2N бит информации. Во втором алфавите 4*N букв и log2(4*N) бит на букву. Тогда разность количеств информации в сообщениях:

100*log2(4*N) - 100*log2N = 100*(2+ log2N) - 100*log2N = 100*2 = 200.

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

Задача 4. “Количество команд”. Программист написал программу на языке машинных команд, которая последовательно раз-

мещается в памяти начиная с нулевого адреса. Каждая команда занимает 4 байта памяти. Шестна-дцатеричный адрес последней команды в программе равен 28. Сколько команд содержит эта про-грамма? Ответ обоснуйте.

11 команд. Объяснение: Адрес последней команды 2816=4010 – это адрес байта, с которого на-

чинается последняя команда (именно начинается, так как сказано, что адрес первой команды равен 0 – это адрес первого байта памяти). Значит, предыдущая команда закончилась байтом с адресом 39, и тогда последний байт последней команды будет иметь адрес 43. А так как адреса отсчитыва-ются с 0, то всего в программе 44 байта, то есть 11 команд.

Задача 5. “Новобранцы”. На первом построении вновь призванные в армию солдаты построились в шеренгу. По коман-

де старшины «Напра-во!» некоторые солдаты повернулись направо, а некоторые — налево (на 90°). Каждый солдат, оказавшийся лицом к лицу со своим соседом считает, что совершил ошибку и разворачивается на 180°.

Ваша задача — помочь старшине, объяснив, будут ли солдаты вертеться бесконечно или мож-но указать максимально возможное количество разворотов новобранцев. Возможна ли (если да, при каких условиях) ситуация, когда в конце концов все солдаты построятся правильно? Ответ обоснуйте.

Для того, чтобы ответить на первый вопрос, применим индукцию. Если первый (или послед-

ний) солдат уже стоит спиной к строю (далее будем обозначать это положение «в лес»), то он, ес-тественно, больше уже не повернётся. Если первый солдат стоит лицом «к строю», а второй «в лес», то в результате разворота, первый солдат будет смотреть «в лес». Предположим, что это справедливо и для случая, когда i - 1 солдат смотрят «в строй», а i-й — «в лес». Очевидно, если i солдат смотрят «в строй», а i + 1 — «в лес», то последовавшим разворотом доказываем индукцию. Далее отсекаем крайних солдат и повторяем рассуждения. Поскольку количество новобранцев ко-нечно, процесс конечен. Ответ: «Да, можно». Заметим, что формулировка не требует вывода фор-мулы для оценки максимального количества разворотов.

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

Задача 6. “ Лягушка”. Квадратное лесное болото разделено на 8*8 одинаковых клеток. На одной из клеток сидит ля-

гушка, а над какой-то другой клеткой летает комар. Лягушка хочет съесть комара, а комар стара-ется от нее улететь. Перемещаются лягушка и комар по очереди, первый ход за лягушкой. За один прыжок лягушка перемещается на любую из клеток по горизонтали или вертикали, не обязательно соседнюю. Комар за один перелет перемещается на одну из 8 соседних клеток. Если лягушка в прыжке пролетает через клетку, над которой находится комар, или прыгает на клетку, над которой летает комар, то она съедает комара. В последнем прыжке лягушка может перемещаться по диаго-нали на одну клетку. Требуется составить оптимальный алгоритм перемещения лягушки для того, чтобы съесть комара. Отсчет начинается с левого верхнего угла. Ответ обоснуйте.

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

Алгоритм: 1. Получить координаты комара (xk, yk). 2. Если координаты комара совпадают с координатами лягушки (xl, yl) перейти к п. 5 3. Если xk=xl или yk=yl или (|xk - xl| = 1 и |yk - yl| = 1), то xl=xk, yl=yk, перейти к п. 5 4. Если (|xk - xl| > |yk - yl|), то xl = xl + (xk - xl)/|xk - xl|*(xk – xl -1), иначе yl = yl + (yk - yl)/|yk

- yl|*(yk – yl -1) 5. Съесть комара

Практический тур (5 задач)

Задача 1. “Фишки”. Рассмотрим шахматную доску размером NxN. Какое наименьшее число фишек нужно поста-

вить на клетки шахматной доски для того, чтобы на каждой прямой, проходящей через центр про-извольной клетки и параллельной каким-либо сторонам или диагоналям доски, стояла хотя бы од-на фишка? (Фишки ставятся в центры клеток).

Пример входных данных: 4 Пример выходных данных: 8

При четном N ответ будет 2*N, при N нечетном – 2*N+1. Расположение такого количества фишек представлено на рис 1,2.

Доказательство того, что что меньшим числом обойтись нельзя, проще для четного N; на каждой прямой, параллельной одной диагонали, должно стоять по фишке, а на самой диагонали – две (в углах).

Другое доказательство: на каждой показанной на рисунках прямой должно стоять по фиш-ке. Именно это доказательство переделывается на случай нечентного N (рис. 2): кроме 2N-2 пря-мых (на каждой по фишке), следует рассмотреть еще шесть прямых, соединяющих центры клеток A,B,C,D; на них нужно потратить еще не менее 3 фишек.

Осталось отдельно рассмотреть случай N=1. Здесь формула не работает, но программа должна вывести число 1.

Рис. 1 Рис. 2

A

C

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

Задача 2. “Слова”. Студенты и школьники очень любят играть на занятиях в следующую игру, которая называет-

ся «Слова». Выбирается слово и из его букв составляются другие осмысленные слова, при этом каждая из букв исходного слова может быть использована не более того количества раз, сколько она в нем встречается. Напишите программу, помогающую играть в эту игру.

В первой строке входных данных записано выбранное для игры слово. Далее следует число K – количество слов в словаре. В последующих K строках задан "словарь" - множество слов, кото-рые мы считаем осмысленными. Их количество не превышает 100. Слово - это последователь-ность не более чем 255 маленьких латинских букв. Каждое слово записано в отдельной строке. Слова в словаре, как это ни странно, не обязательно располагаются в алфавитном порядке, но не повторяются.

Результатом работы программы должно быть количество полученных слов и сам список слов, которые можно получить из исходного слова. Слова должны быть выданы в том же порядке, в ко-тором они встречаются в словаре. Каждое слово должно быть записано в отдельной строке.

Пример входных данных: soundblaster 10 sound blaster soundblaster master last task sos test bonus done

Пример выходных данных: 7 sound blaster soundblaster last sos bonus done

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

Задача 3. “Змейка”. На шахматной доске размером NxN расставлено k про-

нумерованных фишек. Ежик, который собирает эти фишки, выходит из клетки с координатами (1,1) и должен собрать все фишки в порядке возрастания их номеров. Из клетки с координатами (x,y) ежик может переместиться только в од-ну из четырех соседних, т.е. в одну из клеток с координата-

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

ми (x+1,y), (x-1,y), (x,y+1) или (x,y-1), конечно с соблюдением условия, что он не должен выхо-дить за границы доски. Требуется определить, какое минимальное количество ходов нужно сде-лать, чтобы собрать все фишки. Если ежик проходит через клетку, где содержится фишка с боль-шим номером, чем он сейчас должен взять, то ничего не происходит (он просто проходит, а фишка остается стоять).

Вводятся два числа N и k. Затем вводятся k пар координат (x,y) соответствующих фишек, т.е. сначала для первой фишки, затем для второй фишки и т.д.

Ответом должно быть единственное число – минимальное количество шагов, которое потре-буется для сбора всех фишек в порядке возрастания их номеров.

Пример входных данных: 4 3 3 3 1 4 2 1 Пример выходных данных: 11 Пусть перед сбором очередной фишки ежик находится в клетке a(x,y), а фишка расположена в

клетке b(x1,y1). Необходимо определить какое количество ходов ему надо сделать, чтобы доб-раться до фишки. Это сделать довольно просто, т.к. ему, как бы он не шел, нужно пройти через все столбцы, которые находятся между стартовым и конечным (так он попадет в столбец с фишкой). А теперь двигаясь в этом столбце ему нужно либо подняться, либо опуститься до фишки, т.е. пройти через все строки между стартовой и конечной. В результате получаем, что для перехода из клетки a(x,y) в клетку b(x1,y1) нужно сделать │x-x1│ шагов при переходе между столбцами и │y-y1│шагов при переходе между строками. Значит, к общей сумме нужно добавлять сумму модулей разности между соответствующими координатами. Последовательно выполняя суммирование для клеток, в порядке их обхода, и получаем ответ.

long n,x,y,x1,y1,sum,i,k; void main() { cin>>n>>k; x=1;y=1; //стартовая клетка sum=0; for(i=1;i<=k;i++) { cin>>x1>>y1; //клетка, в которую надо переместиться sum+=abs(x-x1)+abs(y-y1); x=x1;y=y1; } cout<<sum; }

Задача 4 «Густой лес» На плоскости во всех точках с целочисленными координатами от 1 до N стоят деревья - всего

N2 деревьев. Путник находится в точке с координатами (x1,y1), где x1,y1>0 и хоть одна из этих ко-ординат больше N (чтобы не оказаться в самом лесу). Требуется определить, видно ли путника из

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

точки с координатами (0,0). Путника не видно, если на прямой, проходящей через точку (0,0) и точку (x1,y1), есть хоть одно дерево.

На вход подается три целых числа – N, x1, y1. Требуется вывести YES, если путника видно и NO иначе. Пример входных данных1 5 6 2 Пример выходных данных1 NO

Пример входных данных2 5 7 6 Пример выходных данных2 YES

Путника не будет видно только в том случае, если на прямой, соединяющей точку (0,0) и точ-

ку (x1,y1) есть хотя бы одно дерево. Можно было бы перебрать все точки леса и проверять данное условие. А можно поступить следующим образом. Для того, чтобы точки (x1,y1) и (x2,y2) лежали на одной прямой угловые коэффициенты y1/x1 и y2/x2 должны быть равны. Если сократить дробь y1/x1 и в получившейся дроби числитель и знаменатель будут не больше, чем n, значит, есть дере-во на прямой соединяющей точку (0,0) и точку (x1,y1). Т.е. задача сводится к сокращению дроби, и если оба коэффициента не больше n, то путника не видно, иначе – видно. Для сокращения мож-но использовать алгоритм Евклида нахождения наибольшего общего делителя.

long nod(long a, long b) { long ost; while(b>0) { ost=a%b; a=b; b=ost; } return a; } long n,x,y,q; void main() { cin>>n; cin>>x>>y; q=nod(x,y); x/=q; y/=q; if(x<=n && y<=n) cout<<"NO"; else cout<<"YES"; }

Задача 5. “Боулинг”. При игре в боулинг дается десять подходов, каждый из них состоит из двух бросков. Перед

каждым подходом на дорожке выставляется 10 кегель. Цель – сбить как можно больше за два бро-ска. Если с первого броска все сбить не удалось, то у вас есть второй бросок, чтобы попасть по ос-тавшимся кеглям. Если будут сбиты все десять кегель с первого броска в подходе, то это называ-ется «strike». Если десять кегель сбиты за два броска, то это «spare». Количество кегель, сбитое в

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

подходе, прибавляется к общей сумме игрока. Но если в предыдущем броске у вас был «strike» или «spare», то еще будут получены дополнительные очки.

Если предыдущий бросок был «strike», то количество сбитых кегель в текущем подходе умно-жается на два. Если же два предыдущих броска были «strike», то количество сбитых кегель в те-кущем подходе умножается на три. Если предыдущий бросок был «spare», то на два умножается только количество кегель сбитых первым броском в текущем подходе (например, пусть предыду-щий был «spare» и в этот подход игрок двумя бросками сбил всего 8 кегель, 5 и 3 соответственно, тогда к общей сумме будет прибавлено 5*2+3=13 очков).

Вам дана таблица десяти бросков и требуется посчитать, какая будет итоговая сумма. Вводится 10 пар чисел, по одной на подход. Каждое из чисел – количество кегель, сбитое в со-

ответствующем броске (естественно, что каждое число может быть от 0 до 10). Если был «strike», то строка будет такая: 10 0 (потому что второй бросок уже не нужен, т.к. сбиты все кегли, но для таблицы формально будем считать, что вторым броском было сбито 0 кегель).

Требуется вывести одно число – итоговая сумма Пример входных данных: 6 4 8 2 9 0 0 10 10 0 10 0 6 0 7 3 10 0 9 1

Пример выходных данных: 164 Пояснение: у игрока было 5 «spare» - 1-й, 2-й, 4-й,

8-й и 10-й подходы и три «strike» - 5-й, 6-й и 9-й подхо-ды. Промежуточные итоговые суммы были следующие:

10 (+ 6+4) 28 (+ 2*8+2) 46 (+ 2*9+0) 56 (+ 10) 76 (+ 2*10+0) 96 (+ 2*10+2*0) 114 (+ 3*6+3*0) 124 (+ 7+3) 144 (+ 2*10+0) 164 (+ 2*9+2*1)

Для решения задачи удобно завести массив, где указывать был подход strike, spare или простой

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

1. два предыдущих подхода были strike 2. предыдущий подход был strike 3. предыдущий подход был spare 4. предыдущий подход не дает бонусных очков и в соответствии с этим прибавить необходимое число к итоговой сумме. long a[15],sum,i,x,y; void main() { // в массиве 1 - это strike, 2 - это spare sum=0; a[0]=0;a[1]=0; for(i=1;i<=10;i++) { cin>>x>>y; if(x= =10) a[i+1]=1; else if((x+y)= =10) a[i+1]=2; if(a[i]= =1) { if(a[i-1]= =1) sum+=3*(x+y); else sum+=2*(x+y);

XV Олимпиада среди школьников г. Петрозаводска по Информатике http://media.karelia.ru/~olimp/

Организаторы: Комитет по образованию, Петрозаводский государственный университет Спонсоры Олимпиады: компания «Ноутис», корпорация «Крафтвей», LandMark, Диаско, компания ОФИСКЛАБ, магазин «Экслибрис», Карельский Региональный Центр ФИО, Администрация г. Петрозаводска, РЦ НИТ ПетрГУ

} else if(a[i]= =2) sum+=2*x+y; else sum+=x+y; } cout<<sum; }