1. Прибавь 1,
2. Умножь на 2.
Первая из них увеличивает на 1 число на экране, вторая удваивает его.
Программа для Удвоителя — это последовательность команд. Сколько существует программ, которые число 3 преобразуют в число 26? Пояснение.
Обозначим R(n) — количество программ, которые преобразуют число 2 в число n. Обозначим t(n) наибольшее кратное 2, не превосходящее n. Заметим, что мы можем получить только числа, кратные 2.
Верны следующие соотношения:
1. Если n не делится на 2, то тогда R(n) = R(t(n)), так как существует единственный способ получения n из t(n) — прибавлением единиц.
2. Пусть n делится на 2. Тогда R(n) = R(n / 2) + R(n − 1)= R(n / 2) + R(n − 2) (если n > 4). При n = 4: R(n) = 1 (один способ: прибавлением единицы), при n = 5: R(n) = 1. Достаточно вычислить значения R(n) для всех чисел, кратных 2 и не превосходящих 26.
Имеем:
R(4)= 1 = R(5),
R(6) = 2 = R(7),
R(8) = R(4) + R(6) = 1 + 2 = 3 = R(9),
R(10) = R(5) + R(8) = 1 + 3 = 4 = R(11),
R(12) = R(6) + R(10) = 2 + 4 = 6 = R(13),
R(14) = R(7) + R(12) = 2 + 6 = 8 = R(15),
R(16) = R(8) + R(14) = 3 + 8 = 11 = R(17),
R(18) = R(9) + R(16) = 3 + 11 = 14 = R(19),
R(20) = R(10) + R(18) = 4 + 14 = 18 = R(21),
R(22) = R(11) + R(20) = 4 + 18 = 22 = R(23),
R(24) = R(12) + R(22) = 6 + 22 = 28 = R(23),
R(26) = R(13) + R(24) = 6 + 28 = 34.
Ответ: 34.
A, B и С – целые числа, для которых истинно высказывание
¬(А = B) ∧ ((B < A)→(2C > A)) ∧ ((A < B)→(A > 2C))
Чему равно A, если C = 8 и B = 18?.
Пояснение.
Логическое "И" истинно тогда и только тогда, когда истинны оба утверждения.
1) ¬(А = B) = 1, то есть А ≠ 18 = 1.
2) ((B < A)→(2C > A)) Применим преобразование импликации: (18 > A) ∨ (16 > A) = 1
3) (A < B)→(A > 2C) Применим преобразование импликации: (A > 18) ∨ (A > 16) = 1
Из 2) и 3) следует, что (18 > A) и (A > 16), так как в противном случае возникает противоречие А = 17
Критерии оценивания выполнения задания |
Баллы |
Выполнены все три действия |
3 |
Правильно выполнены два действия из трёх. При этом при написании операций сравнения допускается одно неправильное использование строгих/нестрогих неравенств (считается несущественной ошибкой, погрешностью записи). Например, вместо «y>=x» один раз используется «y>x». В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
2 |
Правильно выполнено только одно действие из трёх, то есть либо только приведена таблица, которая содержит ошибки в не более чем одной строке, либо таблица не приведена (или приведена и содержит ошибки более чем в одной строке), но исправлена одна ошибка программы. При оценивании этого задания на 1 балл допускается не учитывать корректность работы программ на точках границ областей (вместо нестрогих неравенств в решении были использованы строгие неравенства или наоборот). В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
1 |
Ни один из пунктов задания не выполнен, то есть не выполнены критерии, позволяющие поставить ученику 1 балл |
0 |
Максимальный балл |
3 |
Требовалось
написать программу, которая
вводит с клавиатуры
координаты точки на плоскости
(x, y — действительные
числа) и определяет принадлежность
точки заштрихованной области
(включая границы). Программист
торопился и написал
программу неправильно.
Ниже для Вашего удобства
программа представлена
на четырёх языках программирования.
Бейсик |
Паскаль |
INPUT x, y IF x>=-1 THEN IF y>=-1 THEN IF y<=1 THEN IF x*x+y*y<=1 THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" END IF END IF END IF END IF END |
var x,y: real; begin readln(x,y); if x>=-1 then if y>=-1 then if y<=1 then if x*x+y*y<=1 then write('принадлежит') else write('не принадлежит'); end |
Си |
Алгоритмический |
#include<stdio.h> void main() { float x,y; scanf("%f%f",&x,&y); if (x>=-1) if (y>=-1) if (y<=1) if (x*x+y*y<=1) printf("принадлежит"); else printf("не принадлежит"); } |
алг нач вещ x,y ввод x,y если x>=-1 то если y>=-1 то если y<=1 то если x*x+y*y<=1 то вывод 'принадлежит' иначе вывод 'не принадлежит' все все все все кон |
Последовательно выполните следующее.
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F, G, H, I). Точки, лежащие на границах областей, отдельно не рассматривать. Координатные оси не являются границами областей. В столбцах условий укажите «да», если условие выполнится, «нет», если условие не выполнится, «—» (прочерк), если условие не будет проверяться, «не изв.», если программа ведёт себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв.». В последнем столбце укажите «да» или «нет».
Область |
Условие1 (x>=–1) |
Условие 2 (y>=–1) |
Условие 3 (y<=1) |
Условие 4 (x*x+y*y<=1) |
Программа выведет |
Область обрабатывается верно |
A |
|
|
|
|
|
|
В |
|
|
|
|
|
|
С |
|
|
|
|
|
|
D |
|
|
|
|
|
|
Е |
|
|
|
|
|
|
F |
|
|
|
|
|
|
G |
|
|
|
|
|
|
Н |
|
|
|
|
|
|
I |
|
|
|
|
|
|
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)
Пояснение.
Элементы ответа:
Область |
Условие1 (x>=–1) |
Условие 2 (y>=–1) |
Условие 3 (y<=1) |
Условие 4 (x*x+y*y<=1) |
Программа выведет |
Область обрабатывается верно |
A |
нет |
— |
— |
— |
— |
нет |
B |
да |
да |
нет |
— |
— |
нет |
C |
нет |
— |
— |
— |
— |
нет |
D |
да |
да |
да |
нет |
не принадлежит |
нет |
E |
да |
да |
да |
да |
принадлежит |
да |
F |
да |
да |
да |
нет |
не принадлежит |
да |
G |
да |
да |
да |
нет |
не принадлежит |
нет |
H |
нет |
— |
— |
— |
— |
нет |
I |
да |
нет |
— |
— |
— |
нет |
Возможная доработка (Паскаль, отдельно рассматриваем области, лежащие по разные стороны от прямой x=0):
if (x*x+y*y<=1) and (x>=0) or (x<=0) and (x>=-1) and (y<=1) and (y>=-1) then
write('принадлежит')
else write('не принадлежит')
Возможная доработка (Си, объединение двух пересекающихся областей):
if((x*x+y*y<=1) || (x>=-1) && (x<=0) && (fabs(y)<=1))
printf("принадлежит");
else
printf("не принадлежит");
Обратите внимание! При разделении области вдоль какой-либо линии точки, которые лежат на этой линии внутри области, могут быть причислены к одной части, к другой или к обеим (то есть, например, в приведённом решении на языке Паскаль одно из условий (x>=0 или x<=0) может быть строгим) Могут быть и другие верные способы доработки.
Критерии оценивания выполнения задания |
Баллы |
Предложен правильный алгоритм, выдающий верное значение. Допускается запись алгоритма на другом языке, использующая аналогичные переменные. В случае, если язык программирования использует типизированные переменные, описания переменных должны быть аналогичны описаниям переменных на естественном языке. Использование нетипизированных или необъявленных переменных возможно только в случае, если это допускается языком программирования, при этом количество переменных и их идентификаторы должны соответствовать условию задачи. В алгоритме, записанном на языке программирования, допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора программы. |
2 |
В любом варианте решения может присутствовать не более одной ошибки из числа следующих: 1) не инициализируется или неверно инициализируется переменная; 2) при выводе ответа не учитывается, что требуемого числа в массиве может не быть; 3) отсутствует вывод ответа; 4) в сравнении перепутан знак; 5) неверно осуществляется проверка делимости; 6) на делимость проверяется не значение элемента, а его индекс; 7) в сложном условии вместо логической операции «И» используется логическая операция «ИЛИ»; 8) используется переменная, не объявленная в разделе описания переменных; 9) не указано или неверно указано условие завершения цикла; 10) индексная переменная в цикле не меняется (например, в цикле while) или меняется неверно; 11) неверно расставлены операторные скобки |
1 |
Ошибок, перечисленных в п. 1–11, две или больше, или алгоритм сформулирован неверно |
0 |
Максимальный балл |
2 |
На пустой шахматной доске в одной из клеток стоит шахматный конь. Опишите на русском языке или на одном из языков программирования алгоритм получения списка клеток, которые конь может достичь за один ход из данной клетки. На вход программы поступают два целых числа: х, у (1 < х,у < 8) — координаты клетки, в которой стоит конь. На выходе программы должен быть выведен список пар целых чисел — координаты клеток, достижимых конём из исходной клетки за один ход.
Пояснение.
Заметим, что разность соответствующих координат клеток соединённых ходом коня, равна 1 и 2 по модулю. Можно использовать данный критерий при переборе клеток доски. Пример программы на языке Паскаль:
var i, j, x, y, d1, d2 : integer;
begin
readln(x, y);
for i := 1 to 8 do
for j := 1 to 8 do
begin
d1 := abs(i-x);
d2 := abs(j-y);
if ((d1=1) and (d2=2)) or ((d1=2) and (d2=1)) then writeln(i, ' ', j);
end;
end.
Критерии оценивания выполнения задания |
Баллы |
Не выполнено ни одно из условий, позволяющих поставить 3, 2 или 1 балл. |
0 |
Не выполнены условия, позволяющие поставить 3 или 2 балла, и выполнено одно из следующих условий. 1. Первое задание выполнено полностью. 2. Во втором задании правильно указано одно из двух возможных значений S и для этого значения указана и обоснована выигрышная стратегия Пети. 3. Первое задание выполнено частично, и для одного из остальных заданий правильно указано значение S. 4. Для второго и третьего задания правильно указаны значения S. |
1 |
Не выполнены условия, позволяющие поставить 3 балла, и выполнено одно из следующих условий. 1. Задание 3 выполнено полностью. 2. Первое и второе задания выполнены полностью. 3. Первое задание выполнено полностью или частично; для заданий 2 и 3 указаны правильные значения S. |
2 |
Выполнены второе и третье задания. Первое задание выполнено полностью или частично. Здесь и далее в решениях допускаются арифметические ошибки, которые не искажают сути решения и не приводят к неправильному ответу. |
3 |
Максимальный балл |
3 |
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
добавить в кучу один камень (действие А) или
утроить количество камней в куче, а затем убрать из кучи 2 камня (действие Б).
Например, имея кучу из 10 камней, за один ход можно получить кучу из 11 или 28 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится более 30. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 31 или больше камней.
В начальный момент в куче было S камней, 2 ≤ S ≤ 30.
Говорят, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока – значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.
Выполните следующие задания. Во всех случаях обосновывайте свой ответ.
1.
а) При каких значениях числа S Петя может выиграть первым ходом? Укажите все такие значения и выигрывающий ход Пети.
б) Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом. Опишите выигрышную стратегию Вани.
2. Укажите два значения S, при которых у Пети есть выигрышная стратегия, причём (а) Петя не может выиграть первым ходом, но (б) Петя может выиграть своим вторым ходом, независимо от того, как будет ходить Ваня.
Для указанных значений S опишите выигрышную стратегию Пети.
3. Укажите такое значение S, при котором
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети, и при этом
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Для указанного значения S опишите выигрышную стратегию Вани.
Постройте дерево всех партий, возможных при этой выигрышной стратегии Вани (в виде рисунка или таблицы). На ребрах дерева указывайте, кто делает ход, в узлах – количество камней в позиции.
Пояснение.
1. а) Петя может выиграть, если S =11, …, 30. При меньших значениях S за один ход нельзя получить кучу, в которой не менее 31 камня. Пете достаточно увеличить количество камней в 3 раза и отнять два камня (действие Б).
б) Ваня может выиграть первым ходом (как бы ни играл Петя), если исходно в куче будет S = 10 камней. Тогда после первого хода Пети в куче будет 11 камней или 28 камней. В обоих случаях Ваня выполняет действие Б и выигрывает в один ход.
2. Возможные значения S: 4, 9. В этих случаях Петя, очевидно, не может выиграть первым ходом. Однако он может получить кучу из 10 камней (при S = 4 он выполняет действие Б; при S = 9 – добавляет 1 камень т. к. выполняет действие А). Эта позиция разобрана в п. 1 б. В ней игрок, который будет ходить (теперь это Ваня), выиграть не может, а его противник (то есть Петя) следующим ходом выиграет.
3. Возможное значение S: 8. После первого хода Пети в куче будет 9 камней или 22 камня. Если в куче станет 22 камня, Ваня выполнит действие Б и выиграет своим первым ходом. Ситуация, когда в куче 9 камней, разобрана
в п. 2. В этой ситуации игрок, который будет ходить (теперь это Ваня), выигрывает своим вторым ходом.
В таблице изображено дерево возможных партий при описанной стратегии Вани. Заключительные позиции (в них выигрывает Ваня) подчёркнуты. На рисунке это же дерево изображено в графическом виде (оба способа изображения дерева допустимы).
|
Положения после очередных ходов |
|||
Исх. полож. |
1‐й ход Пети (разобраны все ходы) |
1‐й ход Вани (только ход по стратегии) |
2‐й ход Пети (разобраны все ходы) |
2‐й ход Вани (только ход по стратегии) |
8 |
8+1 =9 |
9+1=10 |
10+1=11 |
3*11–2=31 |
3*10–2=28 |
3*28–2=82 |
|||
3*8–2=22 |
3*22–2=64 |
|
|
|
Критерии оценивания выполнения задания |
Баллы |
Программа работает для любых входных данных произвольного размера и находит ответ, не сохраняя входные данные в массиве, размер которого соответствует числу N (количеству запросов). Программа просматривает входные данные один раз. Допускается наличие в тексте программы одной синтаксической ошибки: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных (если одна и та же ошибка встречается несколько раз, то это считается за одну ошибку). |
4 |
Программа работает верно, но входные данные запоминаются в массиве, размер которого соответствует числу N. Этот массив, возможно, потом сортируется. Допускается наличие от одной до трех синтаксических ошибок. Возможно, в принципиально верно организованном вводе данных есть одна ошибка (например, использование read вместо readln в Паскале или неверное считывание строки в C++). Три балла также выставляется, если в эффективной программе, удовлетворяющей критериям выставления 4 баллов, есть одна ошибка, в результате которой программа работает неверно на некоторых наборах нетипичных входных данных. |
3 |
Программа работает в целом верно, эффективно или нет, но в реализации алгоритма содержится до двух ошибок (неверная инициализация счётчиков, допущена ошибка в принципиально верно организованной сортировке или алгоритме поиска минимальных элементов, используется знак “<” вместо “<=”, “or” вместо “and” и тому подобное). Возможно, некорректно организовано считывание входных данных. Допускается наличие от одной до пяти синтаксических ошибок, описанных выше |
2 |
Программа, возможно, неверно работает при некоторых входных данных, но по приведённому тексту решения ясно, что экзаменуемый понимает, из каких этапов должно состоять решение задачи. При использовании сортировки она может быть реализована принципиально неверно (например, вместо двух циклов используется один), или допущена принципиальная ошибка в поиске нужных элементов. Всего допускается до 4 различных ошибок в реализации алгоритма, в том числе описанных в критериях присвоения двух баллов. Допускается наличие от одной до семи синтаксических ошибок, описанных выше. |
1 |
Задание не выполнено или выполнено неверно. |
0 |
Максимальный балл |
4 |
На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет следующий формат: <Фамилия> <Инициалы> <номер школы>, где <Фамилия> - строка, состоящая не более чем из 20 символов, <Инициалы> - строка, состоящая из 4-х символов (буква, точка, буква, точка), <номер школы> - не более чем двузначный номер. <Фамилия> и <Инициалы>, а также <Инициалы> и <номер школы> разделены одним пробелом. Пример входной строки:
Иванов П.С. 57
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран информацию, из какой школы (школ) было больше всего участников олимпиады.
Пояснение.
var nс:аrrау[1..99] of integer;
р:1..99;
с: char;
i, N, max: integer;
begin
readln(N);
for i:=l to 99 do nc[i]:=0;
for i:=l to N do
begin
repeat
read(c)
until с=' ';
repeat
read(c)
until с=' ';
readln(p);
nc[p]:=nc[p]+1;
end;
max:=0;
for i:=1 to 99 do
if nc[i]>0 then
if nc[i]>max then max:=nc[i];
for i:=l to 99 do
if nc[i]=max then writeln(i);
readln
end.
