670 likes | 939 Views
Муниципальный этап всероссийской олимпиады школьников по информатике. 2013-2014 учебный год. 7-8 классы. При выполнении заданий для школьников 7-8 классов использование компьютеров не допускается. Задача 1 . ВЛОСО (5 баллов). Какое слово лишнее?
E N D
Муниципальный этап всероссийской олимпиады школьников по информатике 2013-2014 учебный год
7-8 классы При выполнении заданий для школьников 7-8 классов использование компьютеров не допускается
Задача 1. ВЛОСО (5 баллов) Какое слово лишнее? 1) 2) 3) 4) К К В О КО Р Р А А В О КО Ч Ч ЗОН ЗОН БИ БИ ИРПИ ЖИ ЖИ Ф Ф А А Р Р ИРПИ Анаграммы
Задача 2. Сумма16 (5 баллов) Сумму шестнадцатеричных чисел АВ+АВ00+АВ0000+....+АВ00000000 перевели в восьмеричную систему счисления. В этом восьмеричном числе найдите десятую цифру слева.
Решение: АВ+АВ00+АВ0000+....+АВ00000000= АВАВАВАВАВ АВАВАВАВАВ 10101011…10101011 10 знаков 40 знаков 40 div 3 =13 40 mod 3 =1 Первый 16-ричный символ дает два 8-ричных знака. Каждые последующиетри 16-ричных символа дают четыре 8-ричных. А ВАВ АВА ВАВ Десятым 8-ричным знаком будут последние три 2-ных знака 4 2 4 16-ричного числа А. А16 =10102 0102=28
Задача 3. Крипторифм (15 баллов) Крипторифм– это математический ребус, в котором одинаковые цифры шифруются одной и той же буквой, а разным цифрам соответствуют различные буквы. Считается, что никакое число не должно начинаться с нуля. Замените буквы цифрами, чтобы получилось верное выражение. Р Ю М К А + Р Ю М К А А В А Р И Я
Решение: 5-значное число + 5-значное число = 6-значное число Крайняя левая цифра =1, т.е. А =1 А + А =Я, т.е. Я=2; Ю +Ю =А, т.е. М>5, Ю =0 или Ю =5, И - четное Р Ю М К А + Р Ю М К А А В А Р И Я 8 5 9 3 1 + 8 5 9 3 1 1 7 1 8 6 2
Задача 4. Блок-схема (15 баллов) Определите и укажите в ответе, какое значение переменной R будет на выходе. (Операция X modK вычисляет остаток от деления первого аргумента X на второй аргумент K. Например, 6 mod 2 = 0, 7 mod 2 = 1, 1 mod 2 = 1).
Задача 5. Basic_1 (20 баллов) В этой программе вводятся некоторые значения переменных A и D. INPUT “A=”,A INPUT “D=”,D FOR N = 3 TO 7 STEP 2 B = A S = B FOR K = 1 TO N B = B + D S = S + B NEXT K PRINT S;", " NEXT N Нужно определить пропущенный член последовательности 28, …, 24.
INPUT “A=”,A INPUT “D=”,D FOR N = 3 TO 7 STEP 2 B = A S = B FOR K = 1 TO N B = B + D S = S + B NEXT K PRINT S;", " NEXT N 4A+6D = 28
INPUT “A=”,A INPUT “D=”,D FOR N = 3 TO 7 STEP 2 B = A S = B FOR K = 1 TO N B = B + D S = S + B NEXT K PRINT S;", " NEXT N 6A+15D = ?
INPUT “A=”,A INPUT “D=”,D FOR N = 3 TO 7 STEP 2 B = A S = B FOR K = 1 TO N B = B + D S = S + B NEXT K PRINT S;", " NEXT N 8A+28D = 24
4A+6D=28 8A+28D=24 A=10 D=-2 6A+15D = 30 Ответ: 30
Задача 6. Basic_2 (20 баллов) Определить значение переменной S, вычисленное в программе. N=3: DIM A(N),P(N): A(0)=8: A(1)=5: A(2)=9: A(3)=1: P(0)=0 FOR L=1 TO N P(L)=L IF A(P(L-1)) > A(P(L)) THEN R=P(L-1): P(L-1)=P(L): P(L)=R NEXT L S=0 FOR L=0 TO N S = S + S*N + P(L) - L NEXT L PRINT”S=”;S
Задача 7. Pascal (20 баллов) Pascal_1. Определить значение переменной Y, вычисленное в программе. (Операция X div K – целочисленное деление первого аргумента X на второй аргумент K. Например, 6 div 2=3, 7 div 2=3). Program Pascal_1; Type Table = Array [0..2, 0..2] Of Integer; Const T: Table=((2,1,0),(0,2,1),(1,0,2)); Var S, Y, X: Integer; Begin S:=0; Y:=0; X:=12; While X>0 Do Begin S:= T[S, X mod 3]; Y:= Y*3 + S; X:= X div 3; End; WriteLn('Y=',Y); End.
Задача 1. Умножение (20 баллов) Из имеющихся N целых чисел составить такую тройку, произведение которой будет максимальным. Ограничение по времени: 2 сек. Ограничение по памяти: 256 Мбайт
Формат входных данных Первая строка входного файла содержит число N – количество исходных чисел (3 ≤ N ≤ 106). Во второй строке указаны непосредственно сами числа – N чисел, абсолютная величина которых не превышает 30 000. Формат выходных данных В выходной файл записать три искомых числа в том порядке, в котором они расположены в последовательности.
АНАЛИЗ Если числа последовательности неотрицательные, то какие три её числа дадут максимальное произведение? Три максимальных числа последовательности max1, max2, max3. А, если есть и отрицательные? Произведение 2-х отрицательных чисел положительно. Поэтому, нужно найти и два минимальных числа min1 и min2. Затем сравнить min1*min2 и max2*max3и выбрать ту пару, которая имеет наибольшее произведение. Третье число к паре - max1
А, если все числа в последовательности отрицательные? Снова наибольшее произведение дадут три максимальных числа max1, max2, max3.
Решение без учета порядка program Z2014_1; var n:longint; max1,max2,max3,min1,min2,k,i:integer; f:text; begin assign(f,'Task1.in'); reset(f); max1:=-30000; max2:=max1; max3:=max1; min1:=30000; min2:=min1; readln(f,n); for i:=1 to n do begin read(f,k); if k>max1 then begin max3:=max2; max2:=max1; max1:=k end else if k>max2 then begin max3:=max2; max2:=k end else if k>max3 then max3:=k; if k<min1 then begin min2:=min1; min1:=k end else if k<min2 then min2:=k; end; close(f); if (max1>0) and (min1*min2>max2*max3) then write(f,max1,’ ‘,min1,’ ‘,min2) else write(f,max1,’ ‘,max2,’ ‘,max3); end.
Решение с учетом порядка program Z2014_1; var n:longint; a:array[0..1000001] of integer; max1,max2,max3,min1,min2,i:integer; f:text; procedure print(x,y,z:integer); procedure swap(var l,m:integer); var t:integer; begin t:=l; l:=m; m:=t end; begin if x>y then swap(x,y); if x>z then swap(x,z); if y>z then swap(y,z); write(f,a[x],' ',a[y],' ',a[z]) end;
Решение с учетом порядка begin assign(f,'Task1.in'); reset(f); readln(f,n); a[0]:=-30001; a[n+1]:=30001; max1:=0; max2:=0; max3:=0; min1:=n+1; min2:=n+1; for i:=1 to n do begin read(f,a[i]); if a[i]>a[max1] then begin max3:=max2; max2:=max1; max1:=i end else if a[i]>a[max2] then begin max3:=max2; max2:=i end else if a[i]>max3 then max3:=i; if a[i]<a[min1] then begin min2:=min1; min1:=i end else if a[i]<a[min2] then min2:=i; end; close(f); assign(f,'task1.out'); rewrite(f);
Решение с учетом порядка if (a[max1]>0) and (a[min1]*a[min2]>a[max2]*a[max3]) then print(max1,min1,min2) else print(max1,max2,max3); close(f) end.
Задача 2. Гусеница. (30 баллов) Гусеница может двигаться по ветке длины N только вперед. Длина «шага» целое число не более K. Сколько различных вариантов передвижения, при которых гусеница пройдет по ветке от начала до конца. • Формат входных данных • Первая строка файла содержит два целых числа N и K, разделенных пробелом (1≤N≤15, 1≤K≤15, K≤N). • Формат выходных данных • Выходной файл содержит число различных вариантов передвижения.
Задача из муниципального этапа 2011-2012 учебного года Фишка. Фишка может двигаться только вперед по полю длины N. Длина хода фишки не может быть более K. Найти число различных вариантов ходов, при которых фишка может пройти поле от начала до конца. Например, при N=3, K=2 – возможные пути: (1,1,1), (1,2), (2,1), т.е. возможны 3 варианта. 31
Решение Динамическое программирование. Прежде чем найти кол-во маршрутов до позиции N, найдем кол-во маршрутов до позиций 1, 2, 3, …, N-1). 0 1 2 3 … N-1 N Кол-во маршрутов будем хранить в массиве S. 32
Сначала найдем позиции, в которые можно дойти за 1 шаг. Очевидно, что это позиции 1, 2, 3, …, K. Занесем в S[1], S[2], …, S[K] значения 1. S: 1 1 1 … 1 0 … 0 1 2 3 … K N … 33
В S[i] будем хранить количество маршрутов по которым фишка может пройти поле от начала до позиции с номером i. В позицию i можно попасть из позиций i-1, i-2, …, i-K. Каждый этот шаг это продолжение уже существующего маршрута. Значит кол-во маршрутов S[i] равно сумме S[i-1]+S[i-2]+…+S[i-K]. 0 i-K ... i-2 i-1 i N … 34
Таким образом, вычисляя последовательно значения величин S[2], S[3],..., S[N] получаем значение S[N], которое и указывает общее количество различных путей, по которым фишка может пройти поле от начала до позиции с номером N. 35
Решение 1 program O13_911_2; var n,k,i,j:integer; s:array[1..10] of integer; begin assign(input,'task2.txt'); reset(input); readln(n,k); close(input); assign(output,'task2.out'); rewrite(output); for i:=1 to n do if i<=k then s[i]:=1 else s[i]:=0; for i:=2 to n do begin j:=i-1; while (j>0) and (j>=i-k) do begin s[i]:=s[i]+s[j]; j:=j-1 end end; write(s[n]); close(output) end. 36
Решение 2 Рассмотрим процесс заполнения таблицы S при N=6, K=3 1 1 1 0 0 0 i=2 1 2 1 0 0 0 2=2*1-0 i=3 1 2 4 0 0 0 4=2*2-0 i=4 1 2 4 7 0 0 7=2*4-1 i=5 1 2 4 7 13 0 13=2*7-1 i=6 1 2 4 7 13 24 24=2*13-2 a[i]=2*a[i-1] – a[i-k-1] 37
Решение 2 var a:array[-16..15] of integer; i,n,k:integer; f:text; begin assign(f,'task2.in'); reset(f);} read(n,k); close(f); assign(f,'task2.out'); rewrite(f); for i:=-16 to -1 do a[i]:=0; a[0]:=1; a[1]:=1; for i:=2 to n do a[i]:=2*a[i-1]-a[i-k-1]; writeln(f,a[n]); close(f) end. 38
Задача 3. Водопровод. (50 баллов) • . В Кибер-городке построили новый водопровод, который представляет из себя связную фигуру, состоящую из труб. Схема водопровода показа на рисунке, согласно которому видно, что сама схема привязана к прямоугольной системе координат XOY. Конструкция водопровода имеет следующие особенности:
трубы первого типа имеют длину 1 и выкладываются • параллельно осям координат (таким образом, что их • начало и конец имеют целочисленные координаты); • трубы второго типа имеют длину и выкладываются • под углом 45 градусов по отношению к осям координат. • Их начало и конец также имеют целочисленные • координаты; • в местах каждого сопряжения труб имеется свой кран внешнего подключения, позволяющий наполнить весь водопровод водой; • каждая труба имеет свою скорость наполнения водой; • пересечение труб типа 2 в нецелочисленной координате означает, что эти трубы также сопряжены и в этой точке, т.е. вода, достигнув этой точки, начинает распространяться уже в направлении двух труб.
Перед сдачей водопровода в эксплуатацию его необходимо полностью заполнить водой (предполагается, что изначально водопровод абсолютно пуст). При этом заполнить его возможно, используя только один из имеющихся кранов внешнего подключения. Напоминаем, что кран внешнего подключения это точка с целочисленными координатами (например, в точке А на рисунке подключение к водопроводу для заполнения невозможно, а в точках В и С – можно). Известно, что вода распространяется вдоль труб равномерно (но по каждой трубе – со своей скоростью). Труба может наполняться в нескольких местах (например, когда она заполняется с двух концов; или когда в середине диагональной трубы вода попадает из одной трубы в другую – вода распространяется по вновь заполняемой трубе в обе стороны). Написать программу, которая вычислит целочисленные координаты точки, подключение к которой позволит заполнить весь водопровод за минимальное время.
Формат входных данных. Первая строка входного файла содержит число N – количество труб (1≤N≤40). Затем идут N пятерок чисел вида Х1, Y1, Х2, Y2, T, задающих координаты концов трубы и время ее наполнения при условии, что она будет заполняться с одного конца (гарантируется, что каждая труба имеет длину 1 или , все трубы образуют связную фигуру и положение никаких двух труб не совпадает). Все координаты – целые числа, по модулю не превышающие 200, а время наполнения – натуральное число, не превышающее 107. Формат выходных данных. В первую строку выходного файла вывести координаты целочисленной точки, в которой нужно подключиться к водопроводу, чтобы он наполнился за наименьшее время. Во второй строке вывести соответствующее время, за которое в этом случае заполнится водопровод. Время должно быть выведено с точностью не менее 2 знаков после десятичной точки. Если решений несколько, вывести любое из них.
Решение. Алгоритм Флойда Алгоритм Флойда является одним из методов поиска кратчайших путей в графе. Прежде чем представлять алгоритм, необходимо ввести некоторые обозначения. Перенумеруем вершины исходного графа целыми числами от 1 до N. Обозначим через длину кратчайшего пути из вершины i в вершину j, который в качестве промежуточных может содержать только первые m вершин графа. (Промежуточной вершиной пути является любая принадлежащая ему вершина, не совпадающая с его начальной или конечной вершинами.)
Если между вершинами i и j не существует ни одного пути указанного типа, то условно будем считать, что . Из данного определения величин следует, что величина представляет длину кратчайшего пути из вершины i в вершину j, не имеющего промежуточных вершин, т. е. длину кратчайшей дуги, соединяющей i с j (если такие дуги присутствуют в графе). Для любой вершины i положим Отметим далее, что величина представляет длину кратчайшего пути между вершинами i и j.
Обозначим через матрицу размера NxN, элемент (i, j) которой совпадает с . Если в исходном графе нам известна длина каждой дуги, то мы можем сформировать матрицу . Наша цель состоит в определении матрицы , представляющей кратчайшие пути между всеми вершинами рассматриваемого графа.
В алгоритме Флойда в качестве исходной выступает матрица . Вначале из этой матрицы вычисляется матрица . Затем по матрице вычисляется матрица и т. д. Процесс повторяется до тех пор, пока по матрице не будет вычислена матрица .
Рассмотрим основную идею, лежащую в основе алгоритма Флойда. Суть алгоритма Флойда заключается в проверке того, не окажется ли путь из вершины i в вершину j короче, если он будет проходить через некоторую промежуточную вершину m.
Предположим, что нам известны: Кратчайший путь из вершины i в вершину m, в котором в качестве промежуточных допускается использование только первых (m - 1) вершин; Кратчайший путь из вершины m в вершину j, в котором в качестве промежуточных допускается использование только первых (m - 1) вершин; кратчайший путь из вершины i в вершину j, в котором в качестве промежуточных допускается использование только первых (m - 1) вершин.
Тогда, один из двух путей — путь, совпадающий с представленным в пункте 3, или путь, являющийся объединением путей из пунктов 1 и 2 — должен быть кратчайшим путем из вершины i в вершину j, в котором в качестве промежуточных допускается использование только первых m вершин. Таким образом,
Решение задачи. Прежде всего заметим, что трубы могут пересекаться только концами либо серединами. Других случаев пересечения быть не может. Таким образом, если разбить каждую трубу на две «половинки» вдвое меньшей длины, то полученные «полутрубы» пересекаться будут только концами. Если все координаты исходных труб умножить на два, то координаты всех «полутруб» также будут выражаться целыми числами. Далее, если на два умножить также и время заполнения всех труб, то время заполнения «полутрубы» также будет выражаться целым числом секунд. Будем считать, что мы так уже поступили, и далее трубами именуются именно такие «полутрубы».