СПбГУ НИУ ИТМО. Интернет-олимпиада школьников по информатике (2009-2010 уч. год).

Приведены задачи и решения 1 тура отборочного этапа для школьников 9-10 классов:

Информация и её кодирование.

Системы счисления: перевод и выполнение арифметических операций.

Простая задача (2 балла): Вычислите произведение двух чисел: x и y, если x=10111,01112, y=408. В ответе укажите результат в десятичной системе счисления.

Решение:

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

(о правилах перевода систем счисления читайте здесь)

Сначала переведем число x=10111,01112 в десятичную систему счисления:
x=1*16+0*8+1*4+1*2+1*1+0*0,5+1*0,25+1*0,125+1*0,0625=23+0,4375=23,437510

Аналогично поступим с числом y=408:
y=4*8+0*1=3210

Перемножим результаты:
x*y=23,437510*3210=75010

Ответ: 750.

Сложная задача (3 балла): Сколько существует целых положительных чисел меньших 51210 в двоичной записи которых встречается не менее шести единиц подряд. В ответе укажите целое число.

Решение:

Решение еще не готово...

Переведем число 51210 в двоичную систему счисления:
51210=1000'000'0002 (о том, как быстро переводить числа, являющиеся "степенями двойки" в двоичную систему счисления читайте здесь)

Ответ: 20.

Определение основания системы счисления через решение уравнения.

Простая задача (1 балл): Укажите через запятую в порядке возрастания все целые положительные десятичные числа, не превосходящие 26, запись которых в троичной системе счисления оканчивается на 22.

Решение:

Очевидно, первым делом мы переводим число 26 в троичную систему счисления (о правилах перевода систем счисления читайте здесь):
2610=2223

Теперь запишем все целые положительные троичные числа, не превосходящие 222, в порядке возрастания:

000; 001; 002; 010; 011; 012; 020; 021; 022; 100; 101; 102; 110; 111; 112; 120; 121; 122; 200; 201; 202; 210; 211; 212; 220; 221; 222.

Из них на 22 заканчваются всего 3: 022; 122; 222.

Можно и не выписывать все эти числа. Очевидно, что в искомых числах последние две цифры - двойки. Т.е. они имеют вид *22. Сколькими способами можно выбрать первую цифру? Конечно, тремя (0/1/2), т.к. в троичной системе счисления нет других цифр, кроме нуля, единицы и двойки.

Все, что осталось сделать - перевести эти числа в десятичную систему счисления (о правилах перевода систем счисления читайте здесь):

  1. 0223=0*9+2*3+2*1=810;
  2. 1223=1*9+8=1710;
  3. 2223=2*9+8=2610.

Ответ: 8; 17; 26.

Сложная задача (3 балла): Чему равно наименьшее основание позиционной системы счисления Y, при котором 225X=14Y? Ответ записать в виде целого числа.

Решение:

Сначала найдем минимальное основание системы Y, в которой возможно представить число 14. Это основание равно 5 - в четверичной системе нет цифры 4, а пятиричная - минимальная (следующая за 4) система, в которой она есть.

Соответственно, для X это основание равно 6. Переведем число 2256 в десятичную систему счисления: 2256=8910

Дальше будем постепенно увеличивать Y и переводить число 14Y в десятичную систему счисления, пока числа не станут равны (14Y->A10=8910):

2256=8910 145=1*5+4*1=5+4=910
146=6+4=1010
147=7+4=1110
148=8+4=1210
...

Скорее всего читатель уже догадался, что Y=9 тоже маловато будет и до 89 еще далеко. Несложно заметить, что в данной задаче - внимание: в данной задаче - для перевода в десятичную систему счисления мы всегда прибавляем к нужному основанию 4. Это "нужное основание" обозначено Y. Получим уравнение:
14Y=Y+4=8910
Y+4=89
Y=89-4=85

Ответ: 85 (2256=1485).

Объем информации.

Простая задача (2 балла): Укажите минимальное число символов в алфавите, чтобы с помощью слов из пяти букв можно было бы передавать 220 различных сообщений. Слова могут содержать повторяющиеся символы. Ответ дать в виде целого числа (для решения данной задачи можно почитать этот раздел).

Решение:

Воспользуемся видоизмененной (под 5 событий) формулой N=5i; отсюда i=log5N (в какую степень нужно возвести 5, чтобы получить N).

N=220; i=log5220.

Очевидно, что у пятерки нет степени, возведя в которую, получим 220, значит нужно выбрать минимальную степень, когда мы получим число, большее 220:
51=5 - маловато
52=25 - маловато
53=125 - маловато
54=625 - подходит!

Ответ: 4.

Сложная задача (3 балла): Книга, состоящая из 272 страниц, занимает объем 2 мегабайта. Часть страниц книги полностью заняты текстом. Каждая такая страница содержит ровно 1024 символа. Другая часть страниц полностью заполнена изображениями с разрешением 768 на 1024 точек. Известно, что страниц с текстом в 16 раз больше чем страниц с изображениями. Сколько цветов в палитре изображений, если известно, что текстовые символы кодируются двухбайтной кодировкой Unicode. Ответ запишите в виде целого числа.

Решение:

Вес книги складывается из веса страниц с текстом и веса страниц с изображениями:
I=Iт+Iи= 2 Мб = 2*210 Кб = 2*210*210 байт = 2*223 бит = 224 бит.

Iт = k страниц с текстом * k символов на странице * i (инф. вес одного символа) =
= k страниц с текстом * 1024*23 бит = k страниц с текстом * 213 бит.

Iи = k страниц с изображениями * k пикселей * i (глубина цвета) =
= k страниц с изображениями * 1024*768 * i (глубина цвета) бит.

Iи = I-Iт = I - k страниц с текстом * 213;
k страниц с изображениями * 210*768 * i (глубина цвета) =
= 224 - k страниц с текстом * 213;

k страниц с текстом = 16 * k страниц с изображениями;
k страниц с текстом + 16 * k страниц с изображениями = 272;
17 * k страниц с изображениями = 272;
k страниц с изображениями = 16;
k страниц с текстом = 16*16 = 160+60+36 = 220 + 36 = 256;

24 * 210*768 * i (глубина цвета) = 224 - 28 * 213;
214*768 * i (глубина цвета) = 224 - 221;
214*768 * i (глубина цвета) = 221 * (23 - 1);
768 * i (глубина цвета) = 27 * 7;
i (глубина цвета) = 896/768;
i (глубина цвета) ~ 1 (ближайшее целое).

N(количество цветов в палитре) = 2 i (глубина цвета).

N(количество цветов в палитре) = 2.

Ответ: 2.

Основы логики.

Основные понятия и законы математической логики.

Простая задача (1 балл): Какая из логических операций не будет иметь истинного значения, когда на входе операции все аргументы истинны? В ответе укажите номер операции в списке.

  1. Импликация;
  2. Дизъюнкция;
  3. Конъюнкция;
  4. Исключающее ИЛИ.

Решение:

Для решения просто нужно знать таблицы истинности для всех 4-х операций:

1. Импликация (логическое следствие) A -> B
A B F
0 0 1
0 1 1
1 0 0
1 1 1


2. Дизъюнкция (логическое сложение) A v B
A B F
0 0 0
0 1 1
1 0 1
1 1 1


3. Конъюнкция (логическое умноение) A & B
A B F
0 0 0
0 1 0
1 0 0
1 1 1


4. Исключающее ИЛИ
(сложение по модулю два) A B
A B F
0 0 0
0 1 1
1 0 1
1 1 0

Ответ: 4.

Сложная задача (2 балла): Четыре года подряд Коля, Сережа, Ваня и Петя ходили в походы в мае, июне, июле и августе. Каждый мальчик по одному разу был в походе в каждый из перечисленных месяцев, при этом не было такого года, чтобы в один и тот же месяц в поход пошли сразу несколько мальчиков. В первый год Ваня ходил в поход в июле, а во второй - в августе. Во второй год в мае в поход ходил Коля. На третий год в июне в поход ходил Петя, а на четвертый год в июле в поход ходил Сережа. В каком месяце ходил в поход Сережа в первый год? В ответе укажите название месяца маленькими буквами в именительном падеже.

Решение:

На самом деле задача довольно простая и решается, большей частью, подбором.

Составим табличку, соответсвующую условию:

год
месяц
I II III IV
Май ? К 0 0
Июнь ? ? П ?
Июль В ? ? С
Август ? В ? ?


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

год
месяц
I II III IV
Май ? К 0 П
Июнь ? ? П ?
Июль В П ? С
Август П В ? ?


Дальше удобно "заполнить Ваню" - буква уже стоит в двух клетках - заполняем оставшиеся две без повторений в строке:

год
месяц
I II III IV
Май ? К В П
Июнь ? ? П В
Июль В П ? С
Август П В ? ?


Очевидно, в правой нижней ячейке должна стоять буква "К" - она займет диагональную ячейку, и мы заполним все "К-ячейки" (т.к. во втором столбце К стоит в первой строке, то в первом столбце поставим ее на вторую строку, чтобы не было повторений строке):

год
месяц
I II III IV
Май ? К В П
Июнь К ? П В
Июль В П К С
Август П В ? К


Оставшиеся ячейки "заполняем Сержей":

год
месяц
I II III IV
Май С К В П
Июнь К С П В
Июль В П К С
Август П В С К


Ответ: май.

Работа с таблицами истинности и упрощение выражений.

Простая задача (1 балл): Для логической функции F(X,Y,Z) известен фрагмент таблицы истинности:



Какие из предложенных выражений соответствуют функции F? В ответе укажите в порядке возрастаний номера соответствующих выражений через запятую.

  1. not (X and Y) and Z;
  2. not (X or not Y) or Z;
  3. not (X and Y) or Z;
  4. (X or Y) and Z;
  5. not (X or Z) or not Y.

Решение:

Просто подставим построчно значения из фрагмента таблицы истинности значения в каждую функцию (условно заменим логические операции матемтическими):

  1. not(X*Y) * Z = not(0*0) * 0 = 1*0 = 0 - можно дальше не проверять - несовпадение по первой строке;
  2. not(X + notY) + Z = not(0 + not0) + 0 = 0 + 0 = 0 - можно дальше не проверять - несовпадение по первой строке;
  3. not(X*Y) + Z = not(0*0) + 0 = 1;
    not(X*Y) + Z = not(0*0) + 1 = 1;
    not(X*Y) + Z = not(0*1) + 0 = 1 - полное совпадение по всем строкам;
  4. (X+Y) * Z = (0+0) * 0 = 0; - можно дальше не проверять - несовпадение по первой строке;
  5. not(X+Z) + notY = not(0+0) + not0 = 1;
    not(X+Z) + notY = not(0+0) + not1 = 1;
    not(X+Z) + notY = not(0+1) + not0 = 1 - полное совпадение по всем строкам.

Ответ: 3, 5.

Сложная задача (3 балла): Упростите логическое выражение или укажите его результат (при его однозначности). Результат упрощения может содержать только операции инверсии, конъюнкции и дизъюнкции.
not (A and B or (A -> B)) -> B

Комментарий по вводу ответа: операнды вводятся большими латинскими буквами; логические операции обозначаются, соответственно как not, and и or. Между названием логической операции и операндом ставится пробел; между открывающей скобкой и операндом или логической операцией пробел не ставится; между операндом или логической операцией и закрывающей скобкой пробел на ставится; между скобками пробел не ставится; перед открывающей скобкой и после закрывающей скобки ставится пробел. Скобки используются только для изменения порядка выполнения операций. Если порядок выполнения операций очевиден из их приоритетов – дополнительное использование скобок считается ошибкой. При однозначном ответе – истинный ответ обозначается как 1, а ложный как 0.

Решение:

Решение еще не готово...

Ответ: ...

Алгоритмизация и программирование.

Языки.

Простая задача (1 балл): Дан фрагмент программы, обрабатывающей массив, размером в M элементов, заполненный неповторяющимися целыми числами.



Сколько элементов массива после обработки не изменят своего значения, если M=21? В ответе укажите целое число.

Решение:

Эту задачу можно решать блоками в уме, чтобы экономить время.

Однако, покажу подробное полное решение.

Итерация - один "проход" по циклу (развернутые определения и подробный материал по циклам находится здесь).

Возьмем произвольный массив из 21 элемента, подходящий под условие:

0123456789 10111213141516171819 20

Первая итерация: i=1; следующая строка присваивает элементу с "номером" [i] (т.е. первому, т.к. i сейчас равно 1) значение элемента с "номером" [M-i+1] (т.е. 21-1+1=21). Если Вы решаете "в уме" важно помнить, что присваивая переменной новое значение, мы "заменяем" старое, что хорошо видно при письменном решении. Таким образом 21-й элемент получает уже измененное значение первого элемента.

Соответственно, после первого "прохода" (i=1) имеем:

20123456789 10111213141516171819 20

Вторая итерация: i=2; элементу с "номером" i присваивается значение элемента с номером [M-i+1] (т.е. 21-2+1=20). Двадцатый элемент при этом получит измененное значение первого.

После второго "прохода" (i=2) имеем:

201923456789 10111213141516171819 20

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

Исходный массив VS Измененный массив:

0123456789 10111213141516171819 20

20191817161514131211 10111213141516171819 20

P.s. Конечно же, читатель захочет увидеть пошаговое выполнение программы:

Шаг 0 из 21:

0123456789 10111213141516171819 20

Ответ: 11.

Очевидно, мы не можем выполнять все пошагово, скажем, для 101 элемента (похожая ситуация предсавлена в следующей задаче) - важно увидеть именно алгоритм и понять, что он делает. Сразу внимательно посмотрев на программу и разобрав начальные шаги, понимаем, что исполнитель изменяет значения элементов первой половины массива, не затрагивая вторую половину (а так как у нас нечетное количество элементов, то "центральный" элеент тоже остается неизменным - соответственно для 101 элемента в ответе получаем 51).