Гомельская областная олимпиада школьников по информатике. (9 января 2003 г.) 5-8 класс. День 1. Для всех задач: ввод с клавиатуры, вывод на экран, время на тест - 2 секунды. Задача 1 “Груз” (5 баллов) Бригада из N человек носили мешки с мукой. Каждый человек перенес Ai кг муки. Сколько кг муки перенесла вся бригада. На входе все числа натуральные, не превосходящие 1000. Входные данные: N A1 A2 ... An Выходные данные: S – количество муки, перенесённое бригадой. Пример ввода: 3 100 200 300 Пример вывода: 600 Задача 2 “ Грибники” (5 баллов) N грибников пошли в лес за грибами. Каждый нашел Ai грибов. Найдите номер грибника, который нашел больше всех грибов и какое минимальное количество грибов нужно насобирать грибнику, который насобирал меньше всех, чтобы обогнать самого лучшего грибника? На входе все числа натуральные, не превосходящие 1000. Входные данные: N A1 A2 ... An Выходные данные: T - номер грибника, который нашел больше всех грибов. K - минимальное количество грибов, которое нужно насобирать грибнику, который насобирал меньше всех, чтобы обогнать самого лучшего грибника. Пример ввода: 4 5 2 3 1 Пример вывода: 1 5 Задача 3 “Игра” (15 баллов) Петя придумал новую игру. Он на песке написал предложение (S), а рядом он написал слово(S1). Он хочет узнать, сколько в предложении (S) слов (S1). Но нужно узнать не только, сколько слов, а еще номер позиции их начала. Причем одну и ту же букву в 2-х словах использовать нельзя. Гарантируется однозначность тестов. Длины исходных слова и предложения не превосходят 255 символов. Формат ввода: S S1 Формат вывода: N - количество слов(S1) в предложении(S). Pos1 Pos2 - номера позиции начала найденного i-го слова. Пример ввода: seresserres ser ... Posn Пример вывода: 2 1 6 Задача 4 “Магазин” (15 баллов) В одной деревне построили сеть фирменных магазинов. Она представлена в виде отрезка с началом в точке (X1 Y1), и концом в точке (X2 Y2). Местным жителям понравился один магазин, который находится в середине отрезка магазинов. Вскоре жители поспорили, чей дом ближе. Помогите им. Известны координаты домов всех жителей (XX YY), а также количество жителей (N). Выведите номер ближайшего дома. Если их несколько выведите первый в порядке появления во входном файле. Ограничения: 1<=N<=1000 Все координаты целые и меньше 10000 Формат ввода: N - количество домов X1 Y1 - координаты концов отрезка, представляющего X2 Y2 собой сеть магазинов. XX[1] YY[1] XX[2] YY[2] - координаты домов жителей. ... XX[N] YY[N] Формат вывода: K - номер ближайшего к любимому магазину дома. Пример ввода: 4 11 44 10 10 31 10 11 15 51 Пример вывода: 2 Задача 5 “Индиана Джонс” Индиана Джонс нашел карту лабиринта (размером N*M). Лабиринт заполнен различными монстрами. У Индианы Джонса есть биологическое оружие, которое может убить K видов монстров. Индиана Джонс находится в точке (X1 Y1), а выход в точке (X2 Y2). Сможет ли Джонс выйти из лабиринта. Чтобы перейти из комнаты(1) в другую комнату(2) нужно уничтожить монстра в комнате(2). На клетки, в которой Джонс уже был идти нельзя т.к. он их заминировал. Ходить можно только по вертикали и горизонтали на одну клетку. В точке (X1 Y1) монстры безобидные. Нужно узнать сможет или нет Джонс выйти, и, если сможет, нужно узнать какое минимальное количество ходов, которое он сделает прежде чем выйдет. Монстры могут обозначаться любым одним символом. Ограничения: N, M<=100 K<=255 Формат ввода: X 1 Y1 X 2 Y2 NM K L1 L2 … Lk A11A12…A1m A21A22…A2m … - описание лабиринта. An1An2…A1m Где L – Виды монстров Которых может уничтожить биологическое оружие Индианы Джонса. Формат вывода: No/Yes Kol – минимальное количество ходов, которое сделает Индиана Джонс, прежде чем выйдет. Пример ввода: 1 1 3 3 3 3 2 x y 1xx wxy 7yy Пример вывод Yes 4 Задача 6 “Числа” (30 баллов) Детям задали на дом задание: Есть множество из N натуральных чисел. Сколькими способами можно разложить число K в сумму чисел из этого множества. Каждое число из ряда можно использовать неограниченное число раз. На входе все числа натуральные, не превосходящие 500. Формат ввода: NK A1 A2 - числа из заданного … множества An Формат вывода: R - количество способов разложения числа K Пример ввода: 36 1 2 3 Пример вывода: 7 Все возможные вариан 3+3 1+2+3 2+2+2 1+1+1+3 1+1+2+2 1+1+1+1+2 1+1+1+1+1+1 Гомельская областная олимпиада школьников по информатике. 9 января 2003г. - 5-8 класс. День 2. Для всех задач: ввод с клавиатуры, вывод на экран, время на тест - 2 секунды. Задача 1 «Самый высокий» (5 баллов) На праздник был устроен конкурс. В конкурсе участвовало N человек. Известен, рос каждого (A[I]). Нужно узнать количество человек, которые равны самому высокому не считая его самого. Ограничение: 1<=N<=10000 1<=A<=10000 Входные данные: N A[1] A[2] ... A[N] Выходные данные: KOL - количество человек, которые равны самому высокому не считая его самого. Пример ввода: 5 100 200 300 300 300 Пример вывода: 2 Задача 2 «Оценки» (5 баллов) Гена получил за день 4 оценки. Вам дан список его оценок, а вам нужно вывести самую маленькую оценку. Входные данные: A1 A2 - оценки Гены. A3 A4 Выходные данные: Min - самая маленькая из оценок. Пример ввода: 1 2 3 4 Пример вывода: 1 Задача 3 «Таблица» (15 баллов) После проведения городской олимпиады в главный компьютер залез злобный вирус и перепутал таблицу с результатами. Но к счастью сохранились количество участников (N), места (A1i), баллы (A2i), фамилия участника (A3i) и класс (A4i). Помогите заново рассортировать таблицу по местам в порядке убывания. Если места равны, вывести в том порядке, в котором они идут во вводе. Места не всегда соответствуют баллам. Входные данные: N A11 A21 A31 A41 A12 A22 A32 A42 ... A1n A2n A3n A4n Выходные данные: B11 B21 B31 B41 B12 B22 B32 B42 – отсортированная ... таблица. B1n B2n B3n B4n Пример ввода: 4 3 100 kyche 7 1 200 ksich 7 4 12 klim 9 2 122 min 11 Пример вывода: 1 200 ksich 7 2 122 min 11 3 100 kyche 7 4 12 klim 9 Задача 4 «Феремер» (15 баллов) Поле фермера имеет вид прямоугольника. Заданы координаты четырех его углов (в порядке обхода - x1 y1 x2 y2 x3 y3 x4 y4) и координаты фермера (xf yf). Нужно выяснить, стоит фермер в центре поля, или нет. Входные данные: x1 y1 x2 y2 x3 y3 x4 y4 xf yf Выходные данные: Yes/No (Yes в случае ответа да, No - нет) Пример ввода: 00 02 22 20 11 Пример вывода: Yes Задача 5 «Праздник» (30 баллов) В селе "Старокалпакское" живет N (1<=N<=100) человек. Каждый человек в селе имеет уникальный номер от 1 до N. Человек 1 решил устроить праздник. В деревне живут добрые и дружные люди и поэтому, если кого-то пригласили на праздник то он, в свою очередь, приглашает всех кого он знает. Вам задается число N и матрица знакомств. Элемент a[i,j] = 1 если человек i знает человека j, а если a[i,j]=0, то человек i не знает человека j. Вывод должен содержать количество приглашенных и их номера в порядке возрастания. Входные данные: N a[1,1] a[1,2] ... a[1,n] a[2,1] a[2,2] ... a[2,n] ... a[n,1] a[n,2] ... a[n,n] Выходные данные: K Nom[1] Nom[2] ... Nom[K] Пример ввода: 3 101 010 001 Пример вывода: 2 13 Задача 6 «Game/Игра» (30 баллов) Компания "BIZZARD" пишет игру под названием "ND - trap". Смысл игры заключается в следующем: 1. Игра ведётся в p-мерном простанстве. 2. Игровое поле размером NxNxN... (p раз). 3. Ячейка поля размерами 1x1x1... (p раз). 4. Дана начальная позиция игрока (матрица A) и позиция игрока при окончании игры (матрица B). 5. На поле K видов смертельных ловушек. Если сумма координат делится на c[i], то в этой ячейке ловушка вида с[i] и в неё нельзя заходить. 6. За один ход можно попасть в смежную клетку. Ограничения: 1<=N<=1000; 1<p<=15; Ai, Bi, Ci - натуральные числа, не превосходящие N 0<=K<=10. Входные данные: NPK A1 A2 … AN - начальная позиция. B1 B2 … BN - конечная точка. C1 C2 … CK - виды ловушек. Выходные данные: R - Минимальное число ходов, за которое можно попасть из начальной точки в конечную Пример ввода: 230 111 222 Пример вывода: 3 Описания алгоритмов решения. Описание алгоритма решения задачи «Груз». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Суммируем числа и выводим ответ. Пример решения: var a:array [1..1000] of longint; i,n,s:longint; begin read(n); for i:=1 to n do read(a[i]); for i:=1 to n do s:=s+a[i]; writeln(s); end. Описание алгоритма решения задачи «Грибники». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. 1.Находим максимальный элемент. 2.Находим минимальный элемент. 3.Находим разницу между максимальным и минимальным. 4.Выводим разницу плюс один. Пример решения: var a:array [1..1000] of longint; n,i,p,p1,max,min:longint; begin read(n); for i:=1 to n do read(a[i]); max:=-maxlongint; for i:=1 to n do if a[i]>max then begin max:=a[i]; p:=i; end; min:=maxlongint; for i:=1 to n do if a[i]<min then begin min:=a[i]; p1:=i; end; writeln(p); writeln((max-min)+1); end. Описание алгоритма решения задачи «Игра». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. 1.Находим в строке(S) строку (S1). 2.Увеличиваем счетчик и помещаем в массив позицию начала найденного слова. 3.Затираем в строке(S) позиции найденного слова (S1). 4.Повторяем это, пока не закончится слово(S). Пример решения: var k:array [1..1000] of longint; p,i,kol,pr:longint; s,s1:string; begin readln(s); readln(s1); while pr<>1 do begin p:=0; p:=pos(s1,s); if p=0 then break; inc(kol); k[kol]:=p; for i:=1 to length(s1) do s[(p+i)-1]:='1'; end; writeln(kol); for i:=1 to kol do writeln(k[i]); end. Описание алгоритма решения задачи «Магазин». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. 1.Находим середину(X Y) отрезка(x1_y1 x2_y2) по формуле X=(X1+X2)/2 Y=(Y1+Y 2.Перебираем все дома и находим и выводим номер расстояние, от которого до середины отрезка минимально по формуле на Паскале: SQRT(SQR(XX[I]X)+SQR(YY[I]-Y)) Пример решения: var p,n,i,x1,y1,x2,y2,xx,yy:longint; min,x,y:real; begin read(n); read(x1,y1); read(x2,y2); x:=(x1+x2)/2; y:=(y1+y2)/2; min:=2323; for i:=1 to n do begin read(xx,yy); if min>(sqrt(sqr(xx-x)+sqr(yy-y))) then begin min:=sqrt(sqr(xx-x)+sqr(yy-y)); p:=i; end; end; writeln(p); end. Описание алгоритма решения задачи «Индиана Джонс». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Пример решения: type ss=array [1..100,1..100] of char; var mn:set of char; que:array [1..10000,1..3] of integer; x1,y1,x2,y2,n,m,k,xx,yy,e,b,i,j,o,kol,x,y:longint; s:string; a:^ss; l:array [1..255] of char; f: char; procedure pm(x,y,kol:longint); begin inc(e); que[e,1]:=x; que[e,2]:=y; que[e,3]:=kol; a^[x,y]:='#'; end; procedure vz(var x,y,kol:longint); begin x:=que[b,1]; y:=que[b,2]; kol:=que[b,3]; inc(b); end; procedure gl; type kn= array [1..4,1..2] of integer; const st:kn=((0,1),(1,0),(-1,0),(0,-1)); begin o:=0; while o<4 do begin inc(o); xx:=x+st[o,1]; yy:=y+st[o,2]; if (xx>0)and(yy>0)and(xx<=n)and(yy<=m)and (a^[xx,yy]=l[1]) then begin pm(xx,yy,kol); if (xx=x2)and(yy=y2) then begin writeln('Yes ',kol); halt; end; end; end; end; begin new(a); read(x1,y1); read(x2,y2); read(n,m); readln(k); for i:=1 to k do begin read(l[i]); mn:=mn+[l[i]]; read(f); end; for i:=1 to n do begin for j:=1 to m do begin read(a^[i,j]); if not(a^[i,j] in mn) then a^[i,j]:='#' else a^[i,j]:=l[1]; end; readln; end; b:=1; e:=0; kol:=0; pm(x1,y1,kol); while b<=e do begin vz(x,y,kol); inc(kol); gl; end; writeln('No'); dispose(a); end. Описание алгоритма решения задачи «Числа». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Для решения необходимо использовать рекурентное соотношение: num[0]:=1; for j:=1 to n do if c[j]<=m then for i:=c[j] to m do num[i]:=num[i]+num[i-c[j]]; Где с[i] - i-ое число из множества m - количество чисел в данном множестве. num[i] - количество способов, которым можно получить число i из чисел данного множества. Пример решения: Var n,i,j:longint; m:longint; c:array[0..501]of longint; num:array[0..501]of longint; Begin read(n,m); for i:=1 to n do read(c[i]); num[0]:=1; for j:=1 to n do if c[j]<=m then for i:=c[j] to m do num[i]:=num[i]+num[i-c[j]]; writeln(num[m]); End. Описание алгоритма решения задачи «Самый высокій». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Пример решения: var a:array [1..10000] of longint; n,i,max,k:longint; begin read(n); for i:=1 to n do read(a[i]); max:=-maxlongint; for i:=1 to n do if max<a[i] then max:=a[i]; for i:=1 to n do if a[i]=max then inc(k); writeln(k-1); end. Описание алгоритма решения задачи «Оценки». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Находим минимальное и выводим его. Пример решения: Var a:array[1..4]of longint; max,i:longint; Begin for i:=1 to 4 do readln(a[i]); max:=a[1]; for i:=2 to 4 do if a[i]>max then max:=a[i]; writeln(max); End. Описание алгоритма решения задачи «Таблица». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Сортируем массив по первой цифре-месту. Пример решения: var s1:array [1..100] of string; a:array [1..100] of longint; ww,ss:string; kk,i,n,j,s,k,k1:longint; code:integer; begin readln(n); for i:=1 to n do begin readln(s1[i]); kk:=pos(' ',s1[i]); ww:=copy(s1[i],1,kk-1); val(ww,a[i],code); end; for j:=1 to n-1 do begin s:=a[j]; k:=j; ss:=s1[j];k1:=j; for i:=j+1 to n do if a[i]<s then begin s:=a[i]; a[k]:=a[j]; a[j]:=s; s1[k1]:=s1[j]; s1[j]:=ss; end; for i:=1 to n do writeln(s1[i]); end. k:=i;ss:=s1[i];k1:=i; end; Описание алгоритма решения задачи «Фермер». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. 1.Находим середину(X Y) отрезка(x1_y1 x3_y3) по формуле X=(X1+X3)/2 Y=(Y1+Y3)/2 2.Проверяем стоит или нет фермер в точке (X Y). Пример решения: var x,y:array[1..100]of longint; i,xf,yf:longint; begin for i:=1 to 4 do read(x[i],y[i]); read(xf,yf); if (xf=(x[1]+x[3]) div 2)and(yf=(y[1]+y[3])div 2) then writeln('Да') else writeln('Нет'); end. Описание алгоритма решения задачи «Праздник». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Данная задача решается поиском в ширину. Люди в селе это вершины графа, а знакомства это дуги между ними. Требуется найти все достижимые вершины из 1. Поиск лучше всего организовывать поиск очередью. Пример решения: Var s:string; qe,qb,i,j,n,m,k,kl:longint; a:Array[1..100,1..100]of byte; color,que:array[1..100]of byte; Begin readln(n); for i:=1 to n do for j:=1 to n do read(a[i,j]); qe:=1; qb:=1; kl:=1; color[1]:=1; que[1]:=1; repeat for i:=1 to n do if (a[que[qb],i]=1)and(color[i]=0) then begin inc(qe); que[qe]:=i; color[i]:=1; inc(kl); end; inc(qb); until qb>qe; writeln(kl); for i:=1 to n do if color[i]=1 then write(i,' '); End. Описание алгоритма решения задачи «Игра». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Данная задача решается Градиентным спуском. В начале алгоритма мы в начальной точке. Смотрим куда можно пойти что-бы приблтзится к конечной точке как можно ближе, и проверяем что-бы там не было ловушки. Алгоритм заканчивает работу, когда дойдет до конечной точки. Пример решения: {$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+,Y+} {$M 16384,0,655360} Var step,n,m,k,i,j,sum:Longint; kol,nap,kor,min,sr:Longint; a,b,c:Array[1..1000]Of Longint; Error,ok:Boolean; Function Rast(ch:char):longint; Begin If ch='-' Then Begin sr:=0; For j:=1 To m Do If i=j Then sr:=sr+ABS((a[j]-1)-b[j]) else sr:=sr+ABS(a[j]-b[j]); rast:=sr End Else Begin sr:=0; For j:=1 To m Do If i=j Then sr:=sr+ABS((a[j]+1)-b[j]) else sr:=sr+ABS(a[j]-b[j]); rast:=sr End; End; Begin Read(n,m,k); For i:=1 To m Do Read(a[i]); For i:=1 To m Do Read(b[i]); For i:=1 To k Do Read(c[i]); Error:=False; While Not error Do Begin inc(step); Min:=MaxLongint; For i:=1 To m Do Begin sum:=0; ok:=true; For j:=1 To m Do sum:=sum+a[j]; Dec(sum); For j:=1 To k Do If sum mod c[j]=0 Then ok:=False; If (ok)and(rast('-')<min)and(a[i]-1>0) Then Begin min:=rast('-'); nap:=i; kor:=-1; End; Inc(sum); Inc(sum); ok:=true; For j:=1 To k Do If sum mod c[j]=0 Then ok:=False; If (ok)and(rast('+')<min)and(a[i]+1<=n) Then Begin min:=rast('+'); nap:=i; kor:=1; End; End; kol:=0; a[nap]:=a[nap]+kor; For i:=1 To m Do If a[i]=b[i] Then Inc(kol); If kol=m Then break; End; WriteLn(step); End. Гомельская областная олимпиада школьников по информатике. 11 января 2003г. 5-8 класс. Задачи командного тура для младших. Задача 1 “Магазин” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. В магазин поступило N (1<=N<=100) бутылок кефира. В каждой Ai ( 0<=A1<=20000) литров кефира. Сколько литров кефира привезли в магазин? Входные данные: N A1 A2 … Выходные данные: K – количество кефира, привезенное в магазин. An Пример ввода: 4 1 2 5 5 Пример вывода: 13 Задача 2 “Дом” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. В одном городе есть дом. Он состоит из N этажей на каждом этаже M квартир, а в каждой квартире проживает A[I,J] человек. Мэр этого города решил расселить жильцов так, чтобы суммарное количество человек на этаже было не больше чем на более высоких этажах. Помогите мэру. На входе все числа натуральные, не превосходящие 100. Входные данные: NM A11 A12 … A1m A21 A22 … A2m – количество … жителей An1 An2 … Anm в квартирах Выходные данные: B11 B12 … B1m B21 B22 … B2m – количество жителей … в квартирах после Bn1 Bn2 … Bnm расселения. Пример ввода: 3 4 5 6 6 5 3 2 1 6 Пример вывода: 6 6 5 5 4 3 3 2 1 Задача 3 “Вертолёты” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. На посадочную площадку должны сесть N вертолетов. Заданы координаты центра и радиус посадочной площадки, количество вертолетов и координаты их посадки. Сколько вертолетов село на посадочную площадку или ее границу? Ограничения: 1<=N<=100 1<=Ai, Bi<=1000 Формат ввода: X Y R – координаты центра и радиус площадки. N – количество вертолетов. A1 B1 A2 B2 – координаты вертолетов. … AN BN Пример ввода: 0 0 10 2 5 5 10 103 Формат вывода: K – количество приземлившихся на площадку вертолетов. Пример вывода: 1 Задача 4 “Место встречи” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. Мальчик и девочка хотят встретится. Мальчик живет в городе C, а девочка в городе V. Каждый город имеет свои координаты. Вам нужно найти номер города где суммарное расстояние от него и до городов V и C будет минимально. Если таких городов несколько то вывести их номера в порядке возрастания. Всего городов N. Города V и С тоже могут быть в ответе. Формат ввода: N V C – целые, не превосходящие 100. X1 Y1 X2 Y2 … Xn Yn Формат вывода: Num1 Num2 … Numn – номера городов в порядке возрастания Пример ввода: 4 0 2 1 3 1 2 0 2 1 3 Пример вывода: 123 Задача 5 “Цепочка” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. Дана цепочка больших английских символов. Символы разделяются знаком "-". Вывести процентное содержание каждого символа в цепочке в порядке встречаемости в строке, т.е. символ который впервые встретился позже чем другой символ будет стоять после него. Формат ввода: S – цепочка символов. Формат вывода: Процентное содержание для каждого символа. Пример ввода: A-B-C Пример вывода: A=33% B=33% C=33% Задача 6 “Двоечник” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. Вася плохо учится. Учительница задала ему на дом написать предложение и сказала, если там будут ошибки, то она поставит ему 1. Вася не хочет получать 1. И он попросил Вас исправить его предложение. Вам дано предложение Васи (длина не более 255 символов). Все слова в предложении разделены пробелами. Вы должны заменить все предлоги "по" на предлоги "на". Все предложения состоят только из маленьких русских букв и точки. Формат ввода: S - исходное предложение. Формат вывода: R – исправленное предложение. Пример ввода: по поле растут ромашки Пример вывода: на поле растут ромашки Задача 7 “Игра” Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. Есть игра под названием "qgame". Поле это лабиринт с N комнатами и M дорогами между ними. Каждая i-ая дорога позволяет пройти из A[i] в B[i]. В каждой i-ой комнате i монстров. Каждая i-ая дорога содержит R[i] монстров. В комнате 1 вход, а в комнате N (1<=n<=100) выход. Требуется определить последовательность комнат, по которой нужно пройти что-бы пройти в n-ую и встретить наименьшее число монстров. Формат ввода: N M A1 B1 R1 A2 B2 R2 … Am Bm Rm Формат вывода: K – минимальное количество монстров, встреченное по пути. V1 V2 … Vn – последовательность вершин этого пути. Пример ввода: 4 4 121 131 241 342 Пример вывода: 9 124 Задача 8 “Chess” (30 баллов) Ввод с клавиатуры. Вывод на экран. Время на тест - 2 секунды. Есть игра под названием "CHESS COOL GAME". Правила в ней такие: 1. Игра ведется на поле NxM. 2. В начале игрок выбирает себе фигуру (это любая шахматная фигура кроме пешки) и ставит его в точку (X;Y). 3. В игре есть стены (их K штук) и на них нельзя ступать. 4. Фигурки ходят точно также как и шахматные. По ней проводится чемпионат, выиграет тот, кто выберет правильную фигуру, т.е. фигуру, которая сможет дойти до клетки (x1;y1) из клетки (x;y). Естественно участники не знают каким будет поле. Вам дается поле и точки (x;y) и (x1;y1). Вам необходимо вывести все фигуры, которые смогут дойти до точки (x1,y1) в любом порядке. Если их нет вывести "NO". Примечания: Фигуры следует выводить через пробел. Используемые фигуры: Конь Слон Ладья Ферзь Король. Фигуры не могут ходить на стены, но Конь может перелетать их. (т.е. если на пути встретилась стена и мы там не становимся, то игнорируем ее). Слон ходит только по диагонали, Ладья ходит по горизонтали и вертикали, Ферзь может ходить как слон и ладья, Король ходит в любую соседнюю клетку (т. е. клетку имеющую хотя бы одну смежную точку стой в которой он стоит) Конь ходит вначале на две клетки в одну сторону, а затем на одну клетку в другую. Формат ввода: N M K - 1<=N, M, K<=100 xy x1 y1 xx[1] yy[1] xx[2] yy[2] – места расположения стен. ... xx[k] yy[k] Формат вывода: Названия фигур по одной через пробел или "NO" Выводить фигуры в следующем порядке: Ладья Слон Конь Ферзь Король Пример ввода: 443 11 44 23 32 33 Пример вывода: Ладья Ферзь Король Описания алгоритмов решения Описание алгоритма решения задачи «Магазин». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Суммируем числа и выводим ответ. Пример решения: Var x,sum,i,n:longint; Begin readln(n); for i:=1 to n do begin readln(x); sum:=sum+x; end; writeln(sum); End. Описание алгоритма решения задачи «Дом». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. 1. Сортируем двумерный массив в порядке убывания. 2. Выводим рассортированный массив. Пример решения: var a:array [1..2500] of longint; n1,n,i,s,j,k,m,kol:longint; begin read(n,m); for i:=1 to n*m do read(a[i]); n1:=n*m; for j:=1 to n1-1 do begin s:=a[j]; k:=j; for i:=j+1 to n1 do if a[i]>s then begin s:=a[i]; k:=i end; a[k]:=a[j]; a[j]:=s; end; for i:=1 to n do begin for j:=1 to m do begin inc(kol); write(a[kol],' '); end; writeln; end; end. Описание алгоритма решения задачи «Вертолёты». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Смотрим расстояния от центра посадки до вертолетов. Если оно меньше или равно радиусу посадки то вертолет призимлился на площадку иначе нет. И потом просто нужно посчитать сколько вертолетов село на площадку. Пример решения: Var r,x,y,i,k,n,x1,y1:longint; Begin read(x,y,r); read(n); for i:=1 to n do begin read(x1,y1); if sqrt(sqr(x-x1)+sqr(y-y1))<=r then inc(k); end; writeln(k); End. Описание алгоритма решения задачи «Место встречи». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Для каждого города находим суммарное расстояние. Затем находим наилучшие города и выводим их (если искать ответы с 1 города тогда сортировать города не нужно). Пример решения: {$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+,Y+} {$M 16384,0,655360} Var ns:array[1..100]of longint; x,y:array[1..100]of real; kl,i,j,n,m,k:longint; s:string; min,tik:double; Begin read(n,m,k); for i:=1 to n do read(x[i],y[i]); min:=maxlongint; for i:=1 to n do begin tik:=sqrt(sqr(x[i]-x[m])+sqr(y[i]-y[m]))+sqrt(sqr(x[i]x[k])+sqr(y[i]-y[k])); if (tik-min<0.00000001) then begin inc(kl); ns[kl]:=i; end; if (tik<min) then begin kl:=1; ns[1]:=i; min:=tik; end; end; for i:=1 to kl do write(ns[i],' '); End. Описание алгоритма решения задачи «Цепочка». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Находим сколько каждого символа в цепочке и общее количество символов. Далее просто считаем процентное содержание каждого символа: kol[i]/okol*100 где: kol[i] - количество i-ых символов. okol - общее количество символов в цепочке. Пример решения: Type e=record c:string[1];k:longint;end; Var s:string; s1:string[1]; i,j,n,kol,kl,l:longint; a:Array[1..200]of e; Begin readln(s); while length(s)>0 do begin s1:=copy(s,1,1); delete(s,1,2); inc(kl); l:=0; for i:=1 to kol do if s1=a[i].c then begin inc(a[i].k); l:=1; end; if l=0 then begin inc(kol); a[kol].k:=1; a[kol].c:=s1; end; end; for i:=1 to kol do writeln(a[i].c,'=',a[i].k/kl*100:0:0,'%'); End. Описание алгоритма решения задачи «Двоечник». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Разбиваем исходное предложение на слова и если среди этих слов есть слово "по" то заменяем его на слово "на". Пример решения: Var s,s1,out:String; i,j,n:LongInt; Begin ReadLn(s); s:=s+' '; While LengTh(s)>0 Do Begin s1 := Copy (s,1,pos (' ',s) - 1); If s1='по' Then out:=out+'на' Else out:=out+s1; Delete (s,1,pos (' ',s) - 1); While (s[1]=' ')And(LengTh(s)>0) Do Begin out:=out+' '; delete(s,1,1); End; End; WriteLn(out); End. Описание алгоритма решения задачи «Игра». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Данная задача на метод "Дейкстра" (но можно писать очередь). Запускаем "Дейкстру" (очередь) из начальной точки в конечную и попутно храним предков (клетку из которой мы пришли в исходную), а когда алгоритм закончил работать то востанавливаем путь по предкам. Пример решения: Const Done=2; Free=1; Var Gr:Array[1..100,1..100]Of Integer; Put,Pred,Metka,Best:Array[1..100]Of Longint; error,xod:Boolean; kol,a,b,min,nom,n,i,j,k,x,y,z:Longint; Begin Readln(n); For i:=1 To n Do For j:=1 To n Do Gr[i,j]:=MaxInt; Readln(k); xod:=true; For i:=1 To k Do Begin Read(x); Read(y); Read(z); Gr[x,y]:=z; End; a:=1; b:=n; For i:=1 To n Do Begin best[i]:=MaxLongint;Metka[i]:=Free;End; Min:=MaxLongint; Nom:=a; Metka[a]:=done; Best[a]:=1; Kol:=0; Pred[a]:=0; Error:=False; While Not error Do Begin Metka[nom]:=done; If nom=b Then Begin i:=nom; While Pred[i]<>0 Do Begin inc(kol); Put[kol]:=i; i:=Pred[i]; End; inc(kol); put[kol]:=a; Break; End; For i:=1 To n Do If (Gr[nom,i]<>MaxInt)and(Gr[nom,i]+Best[nom]+i<Best[i]) Then Begin Best[i]:=Gr[nom,i]+Best[nom]+i;Pred[i]:=nom;End; min:=MaxLongint; For i:=1 To n Do Begin If (Metka[i]=free)and(Best[i]<min) Then Begin Min:=Best[i]; Nom:=i; End; End; End; Write('monstrs = ');Writeln(Best[b]); Write('path = '); For i:=kol DownTo 1 Do Write(Put[i],' '); Readln; End. Описание алгоритма решения задачи «Chess». Автор задачи: Миняйлов Владимир и Вераксич Сергей, СШ 27, 7 класс. Данную задачу лучше всего решать рекурсией (но можно и очередью). Запускаем рекурсию (очередь) из начальной клетки в кнечную и проверяем есть ли путь до конечной клетки. Для каждой фигуры алгоритм запускаем отдельно. Пример решения: {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+} {$M 16384,0,655360} Const names:Array[1..5]of string= ('Ладья','Слон','Конь','Ферзь','Король'); Var a,a1:array[-1..102,-1..102]of byte; ok:array[1..5]of boolean; ii,jj,u,i,j,kol,xx,yy,n,m,k,x,y,x1,y1:longint; Procedure RecRook(xx,yy:byte); begin for i:=1 to n do for j:=1 to m do if (a1[i,j]=0)and(xx=i) or (a1[i,j]=0)and(yy=j) then begin a1[i,j]:=2; if (i=x1)and(j=y1) then ok[1]:=true; RecRook(i,j); end; end; Procedure RecBishop(xx,yy:byte); begin for i:=1 to n do for j:=1 to m do if (a1[i,j]=0)and(abs(xx-i)=abs(yy-j)) then begin a1[i,j]:=2; if (i=x1)and(j=y1) then ok[2]:=true; RecBishop(i,j); end; end; Procedure RecNeight(xx,yy:byte); Const st:array[1..8,1..2]of shortint= ((1,2),(2,1),(-1,-2),(-2,-1),(-1,2),(-2,1),(1,-2),(2,-1)); begin for i:=1 to n do for j:=1 to m do for u:=1 to 8 do if (a1[i,j]=0)and(xx-i=st[u,1])and(yy-j=st[u,2]) then begin a1[i,j]:=2; if (i=x1)and(j=y1) then ok[3]:=true; RecNeight(i,j); end; end; Procedure RecQuein(xx,yy:byte); begin for i:=1 to n do for j:=1 to m do if (a1[i,j]=0)and(xx=i)or (a1[i,j]=0)and(yy=j)or (a1[i,j]=0)and(abs(xx-i)=abs(yy-j)) then begin a1[i,j]:=2; if (i=x1)and(j=y1) then ok[4]:=true; RecQuein(i,j); end; end; Begin read(n,m,k); read(x,y); read(x1,y1); for i:=1 to k do begin read(xx,yy); a[xx,yy]:=1; end; a1:=a; RecRook(x,y); RecRook(x,y); RecRook(x,y); RecRook(x,y); RecRook(x,y); a1:=a; RecBishop(x,y); RecBishop(x,y); RecBishop(x,y); RecBishop(x,y); RecBishop(x,y); RecBishop(x,y); a1:=a; RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); RecNeight(x,y); ii:=x; jj:=y; for i:=1 to n do for j:=1 to m do if a1[i,j]=2 then begin ii:=i; jj:=j;a1[i,j]:=1;end; RecNeight(ii,jj); ii:=x; jj:=y; for i:=1 to n do for j:=1 to m do if a1[i,j]=2 then begin ii:=i; jj:=j;end; RecNeight(ii,jj); ii:=x; jj:=y; for i:=1 to n do for j:=1 to m do if a1[i,j]=2 then begin ii:=i; jj:=j;end; a1[ii,jj]:=1; RecNeight(ii,jj); ii:=x; jj:=y; for i:=1 to n do for j:=1 to m do if a1[i,j]=2 then begin ii:=i; jj:=j;end; a1[ii,jj]:=1; RecNeight(ii,jj); ii:=x; jj:=y; for i:=1 to n do for j:=1 to m do if a1[i,j]=2 then begin ii:=i; jj:=j;end; a1[ii,jj]:=1; RecNeight(ii,jj); a1:=a; RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); RecQuein(x,y); if ok[4] then ok[5]:=true; for i:=1 to 5 do if ok[i] then begin write(names[i],' ');inc(kol);end; if kol=0 then writeln('NO'); End. Гомельская городская олимпиада по информатике (1 декабря 2002 г.) Задачи младшей группы (1-8 классы) Во всех задачах ввод производится с клавиатуры, вывод – на экран. Задача «Лимоны» (5 баллов) В магазин завезли N лимонов. Из каждого выдавили Ai г. лимонного сока, а нужно получить всего K г. Можно ли получить K или более г. лимонного сока? На входе все числа натуральные, не превосходящие 20000. Входные данные: N K A1 A2 ... An Выходные данные: Yes/No(Yes в случае ответа 'ДА',No в противном случае.) Пример ввода: 4 60 10 2 3 10 Пример вывода: No Задача «Марс» (5 баллов) Дети марсиан писали диктант. Каждый получил оценку Ai. На марсе хорошая оценка строго больше X и строго меньше Y. Сколько детей получило хорошие оценки, если их было N человек? На входе все числа натуральные, не превосходящие 1000 Входные данные: NXY A1 A2 - оценки детей марсиан. ... An Выходные данные: K - количество детей, которые получили хорошие оценки Пример ввода: 5 5 10 56789 Пример вывода: 4 Задача «Programming» (15 баллов) На планете Х есть язык программирования под названием "P--". У него есть две версии "согласный" и "гласный". Например, команда "End" на "согласном" языке может выглядеть как "nd" или "dn", а на "гласном" языке она выглядит как "e", то есть в "согласной" версии содержатся все согласные буквы команды в произвольном порядке, а в "гласной" версии содержатся все гласные буквы команды в произвольном порядке. Вам дана программа на исходном языке и программы на "гласном" и "согласном" языках. Вы должны узнать являются ли записи на "согласном" и "гласном" языках записью исходной программы. Гласные буквы на планете Х: aeijouq все остальные символы - согласные буквы. Примечание: Каждая команда содержится в отдельной строке, и программы состоят из маленьких английских букв Входные данные: N - число команд в программе на каждом языке. Далее идут 3 программы, сначала на исходном языке, Выходные данные: Yes/No - для согласного языка. Yes/No - для гласного языка. (Yes в случае правильного ответа) Пример ввода: 2 begin end ngb Пример вывода: Yes No затем на согласном и, наконец, на гласном. dn ei i Задача «Города» (15 баллов) Есть N городов. У каждого города есть координаты (Xi, Yi). 1-ый город заражён вирусом под названием "язвенный суслик". Если расстояние от 1 до какого-то другого города меньше или равно K то он заражается. Выведите номера 2-х городов (один зараженный, а другой не зараженный) расстояние между которыми минимально. Вирус передается только из первого города. С целью спасения нации всегда найдется хотя бы один не зараженный город. Примечание: На вводе только целые числа. Ограничения: 2<=N<=100 -1000<=Xi, Yi<=1000 Входные данные: N K - Количество городов и радиус заражения. X1 Y1 X2 Y2 - Координаты городов … Xn Yn Выходные данные: N1 N2 - номера заражённого и незаражённого города,расстояние между которыми минимально Пример ввода: 31 11 12 22 Пример вывода: 23 Задача «Лабиринт» (30 баллов) Есть лабиринт. Он представляет собой прямоугольник N (строк) на M (столбцов). Мальчик находится в клетке с координатами (X; Y) (X - столбец, Y - строка). Сможет ли он пробраться в клетку (X1; Y1) (X1 - столбец, Y1 - строка), если мальчик может двигаться по горизонтали или по вертикали. Начало координат, клетка (1; 1), находится в первой строке и в первом столбце. Ограничения 1<= N, M <= 100 1<= X, X1 <= M 1<= Y, Y1 <= N Примечание: Мальчик всегда появляется на свободной клетке. В лабиринте: 1- стена.0- проход. Входные данные: N M - размер лабиринта. X Y - координаты начального положения мальчика. X1 Y1 - координаты клетки в которую мальчику необходимо попасть. Далее следует N строк описание лабиринта Выходные данные: Yes/No - 'Yes' в случае когда мальчик сможет добратьсядо нужной клетки и 'No' в противном случае. Пример ввода: 33 11 33 000 010 110 Пример вывода: Yes Задача «Уравнение» (30 баллов) Вам задано уравнение A1*X1+A2*X2+..+An*Xn=M, где n - это количество чисел, Xi - i-я переменная, Ai - коэффициент перед i-ой переменной. Вам необходимо найти некоторое решение (их много), в котором минимальное из значений Xi будет как можно больше. Все числа положительные. Например, в уравнении 2*x1+2*x2=10 есть следующие решения: 2*3+2*2=10 (здесь минимальное 2) 2*4+2*2=10 (здесь минимальное 2) 2*2.5+2*2.5=10 (минимальное 2.5) Наилучший вариант: 2*2.5+2*2.5=10. Входные данные: NM A1 A2 … An - коэффициенты Выходные данные: X - минимальный из корней в решении. Ответ выводить с точностью 6 знаков после запятой. Пример ввода: 3 30 10 10 10 Пример вывода: 1.000000