Published using Google Docs
Решение задач школьного тура олимпиады для учащихся 9-11 классов 2017-18.docx
Updated automatically every 5 minutes

Школьный тур Всероссийской олимпиады по программированию для учащихся 9 – 11 классов 2017-2018

  1. Анализ строк. 1 балл

Заданы две строки. Определить, являются ли они анаграммами, то есть одна строка получена из другой перестановкой букв. 
Например: 
строки "БУК" и "КУБ" или "СОЛЬ" и "ЛОСЬ" являются анаграммами. 

program task_1;

var

   i,j:integer;

   var

   s1,s2,swap:String;

   a:array[1..100,1..2] of String;

begin

  readln(s1);

  readln(s2);

  if(length(s1)=length(s2)) then

    begin

      for i:=1 to length(s1) do

        a[i,1]:=copy(s1,i,1);

      for i:=1 to length(s2) do

        a[i,2]:=copy(s2,i,1);

      for i:=1 to length(s1) do

        for j:=i+1 to length(s1) do

          begin

            if (a[i,1]>a[j,1]) then

              begin

                swap:=a[i,1];

                a[i,1]:=a[j,1];

                a[j,1]:=swap;

              END;

            if (a[i,2]>a[j,2]) then

              begin

                swap:=a[i,2];

                a[i,2]:=a[j,2];

                a[j,2]:=swap;

              end;

          END;

      for i:=1 to length(s1) do

        begin

          if (a[i,1]<>a[i,2]) then

            begin

              i:=length(s1);

              writeln('Не аннаграммы');

            end

          ELSE

            if (i=length(s1)) then

              writeln('Аннаграммы');

        end;

    end

  else

    writeln('Не аннаграммы');

end.

  1. Формирование массива. 1 балл

Даны два массива чисел. Требуется вывести в выходной файл те элементы

первого массива (в том порядке, в каком они идут в первом массиве),

которых нет во втором массиве.

 

Входные данные:

Во входном файле записано сначала число n - количество элементов в первом

массиве, затем n чисел - элементы массива. затем записано число m - количество

элементов во втором массиве. Затем записаны элементы второго массива.

Количество элементов каждого массива не превышает 100. Сами элементы -

числа из диапазона longInt.

 

Выходные данные:

В выходной файл выведите те элементы первого массива, которых нет во втором в том порядке, в каком они идут в первом массиве.

 

пример входного файла

7

3 1 3 4 2 4 12

6

4 15 43 1 15 1

 

пример выходного файла

3 3 2 12

program task_2;

var

   ready:boolean;

   f1,f2:text;

   i,j,n1,n2:integer;

   a,b:array[1..100] of integer;

begin

  assign(f1,'formatin.txt');

  assign(f2,'formatout.txt');

  reset(f1);

  rewrite(f2);

  readln(f1,n1);

  for i:=1 to n1 do

    read(f1, a[i]);

  readln(f1,n2);

  for i:=1 to n2 do

    read(f1, b[i]);

  close(f1);

  for i:=1 to n1 do

    begin

      ready:=true;

      for j:=1 to n2 do

        if(a[i]=b[j]) then

          ready:=false;

      if(ready) then

        write(f2,a[i],' ');

    end;

  close(f2);

end.

 

      3. Максимизация периметра. 4 балла

      Дана прямоугольная таблица, состоящая из N строк и M столбцов. На пересечении i-й строки и       j-го столбца записано целое число aij.

Требуется такую прямоугольную область со сторонами, параллельными сторонам таблицы,   чтобы сумма чисел,  записанных на ее границе была максимальна.

 Например, для таблицы

1

–2

–1

3

–10

–5

1

–4

1

–1

2

–2

2

2

–1

2

 оптимальное решение выглядит так:

1

–2

–1

3

–10

–5

1

–4

1

–1

2

–2

2

2

–1

2

Требуется написать программу, которая по заданным высоте таблицы N, ширине таблицы M и ее элементам aij находит искомую сумму (2 ≤ N, M ≤ 50, –104 ≤ aij ≤ 104).

program task_3;

var

   a:array [1..50,1..50] of integer;

   i,j,n,m,x1,y1,n1,m1,x2,y2,n2,m2,max,s:integer;

begin

  randomize;

  n:=4;

  m:=4;

  for i:=1 to n do

    begin

      for j:=1 to m do begin

        a[i,j]:=random(208)-104;

        write(a[I,J]:3,' ');

        end;

      writeln;

    end;

  max:=a[1,1];

  for x1:=1 to n do

    for y1:=1 to m do

      for n1:=x1 to n do

        for m1:=y1 to m do

          begin

            s:=0;

            for i:=x1 to n1 do

              for j:=y1 to m1 do

                s:=s+a[i,j];

            if(s>max) then

              begin

                max:=s;

              end;

          end;

  writeln(max);

end.

4. Задача "Дейкстра".  6 баллов

 Дан ориентированный взвешенный граф. для него вам необходимо найти кратчайшее расстояние от одной заданной вершины до другой.

 

Входные данные:

В первой строке входного файла три числа: n  s и f (1<n<100),

где n - количество вершин графа,

s – начальная вершина, а f - конечная.

В следующих n строках по n чисел – матрица смежности графа, где число в i-ой строке j-ом столбце соответствует  ребру из i в j: -1 означает отсутствие ребра между вершинами, а любое неотрицательное число - присутствие ребра данного веса.

На главной диагонали матрицы - всегда нули.

 

Выходные данные:

вывести искомое расстояние или -1, если пути между указанными

вершинами не существует.

 

Пример входного файла:

3 1 2

0 -1 2

3 0 -1

-1 4 0

 

Пример выходного файла:

6

 

3 0 -1

-1 4 0

 

пример выходного файла:

6

program task_4;

var f1,f2:text;

i,j,min:integer;

n,s,f,now,res:integer;

ready:boolean;

a:array [1..100,1..100] of integer;

c:array [1..100,1..2] of integer;

begin

assign(f1,'deikstrain.txt');

assign(f2,'deikstraout.txt');

reset(f1);

rewrite(f2);

readln(f1,n,s,f);

for i:=1 to n do begin

for j:=1 to n do

read(f1,a[i,j]);

end;

for i:=1 to n do begin

for j:=1 to n do

write(a[i,j]:3,' ');

writeln;

end;

for i:=1 to n do begin

c[i,1]:=100000;

c[i,2]:=1;

end;

c[s,1]:=0;

ready:=false;

now:=s;

while not ready do begin

ready:=true;

c[now,2]:=1;

min:=1;

for i:=1 to n do

if(a[now,i]>0) then begin

if((c[i,1]=1)and((a[now,i]<a[now,min])or(a[now,min]<=0))) then

min:=i;

if((c[now,1]+a[now,i]<c[i,1])) then

 c[i,1]:=c[now,1]+a[now,i]

 

end;

c[now,2]:=0;

if(a[now,min]>0) then

now:=min

else begin

i:=1;

while (c[i,2]<>1) and (i<n) do

i:=i+1;

now:=i;

end;

for i:=1 to n do

if c[i,2]<>0 then

ready:=false;

end;

write(f2,c[f,1]);

close(f1);

close(f2);

end.

5. Шахматная доска. 6 баллов

На стандартной шахматной доске(8х8) живут Красный и Зеленый шахматные Кони.

они беззаботно скачут по ней пощипывая шахматную травку. Сегодня у Зеленого

Коня день рождения. Кони решили отпраздновать это событие вместе. Для этого

им нужно оказаться на одной клетке. Заметим, что Красный и Зеленый шахматные

Кони сильно отличаются от черного с белым: они ходят не по очереди, а

одновременно, и если они оказываются на одной клетке никто никого не съедает.

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

 

Входные данные

Во входном файле содержатся координаты Коней, записанные по стандартным

шахматным правилам (т.е. двумя символами - маленькая латинская буква (от

a до h) и цифра (от 1 до 8) задающие столбец и строку соответственно)

 

Выходные данные

выходной файл должен содержать наименьшее необходимое количество ходов, либо

-1, если Кони не могут встретиться.

 

пример

a1 a3

 

ответ

1

program task_5;

var

f1,f2:text;

s:String;

x1,y1,x2,y2,k,i,j:integer;

table1,table2,table1flag,table2flag:array [1..8,1..8]of boolean;

ready:boolean;

begin

ready:=false;

assign(f1,'chessin.txt');

assign(f2,'chessout.txt');

reset(f1);

read(f1,s);

val(copy(s,2,1),y1,k);

val(copy(s,5,1),y2,k);

if copy(s,1,1)='a' then

x1:=1;

if copy(s,1,1)='b' then

x1:=2;

if copy(s,1,1)='c' then

x1:=3;

if copy(s,1,1)='d' then

x1:=4;

if copy(s,1,1)='e' then

x1:=5;

if copy(s,1,1)='f' then

x1:=6;

if copy(s,1,1)='g' then

x1:=7;

if copy(s,1,1)='h' then

x1:=8;

if copy(s,4,1)='a' then

x2:=1;

if copy(s,4,1)='b' then

x2:=2;

if copy(s,4,1)='c' then

x2:=3;

if copy(s,4,1)='d' then

x2:=4;

if copy(s,4,1)='e' then

x2:=5;

if copy(s,4,1)='f' then

x2:=6;

if copy(s,4,1)='g' then

x2:=7;

if copy(s,4,1)='h' then

x2:=8;

close(f1);

for i:=1 to 8 do

for j:=1 to 8 do begin

table1[i,j]:=false;

table2[i,j]:=false;

table1flag[i,j]:=false;

table2flag[i,j]:=false;

end;

table1[x1,y1]:=true;

table2[x2,y2]:=true;

k:=0;

if((x1=x2)and(y1=y2)) then

ready:=true

else begin

while((k<10)and(not ready)) do begin

for i:=1 to 8 do

for j:=1 to 8 do begin

table1flag[i,j]:=false;

table2flag[i,j]:=false;

end;

for i:=1 to 8 do

for j:=1 to 8 do begin

if(table1[i,j]=true) then begin

table1flag[i,j]:=true;

table1[i,j]:=false;

end;

if(table2[i,j]=true) then begin

table2flag[i,j]:=true;

table2[i,j]:=false;

end;

end;

for i:=1 to 8 do

for j:=1 to 8 do begin

if(table1flag[i,j]=true) then begin

if((i-1>0)and(j-2>0))then

table1[i-1,j-2]:=true;

if((i-2>0)and(j-1>0))then

table1[i-2,j-1]:=true;

if((i-1>0)and(j+2<9))then

table1[i-1,j+2]:=true;

if((i-2>0)and(j+1<9))then

table1[i-2,j+1]:=true;

if((i+1<9)and(j-2>0))then

table1[i+1,j-2]:=true;

if((i+2<9)and(j-1>0))then

table1[i+2,j-1]:=true;

if((i+1<9)and(j+2<9))then

table1[i+1,j+2]:=true;

if((i+2<9)and(j+1<9))then

table1[i+2,j+1]:=true;

table1[i,j]:=false;

end;

if(table2flag[i,j]=true) then begin

if((i-1>0)and(j-2>0))then

table2[i-1,j-2]:=true;

if((i-2>0)and(j-1>0))then

table2[i-2,j-1]:=true;

if((i-1>0)and(j+2<9))then

table2[i-1,j+2]:=true;

if((i-2>0)and(j+1<9))then

table2[i-2,j+1]:=true;

if((i+1<9)and(j-2>0))then

table2[i+1,j-2]:=true;

if((i+2<9)and(j-1>0))then

table2[i+2,j-1]:=true;

if((i+1<9)and(j+2<9))then

table2[i+1,j+2]:=true;

if((i+2<9)and(j+1<9))then

table2[i+2,j+1]:=true;

table2[i,j]:=false;

end;

end;

for i:=1 to 8 do

for j:=1 to 8 do

if((table1[i,j]=true)and(table1[i,j]=table2[i,j]))then begin

ready:=true;

end;

k:=k+1;

end;

end;

rewrite(f2);

if(ready) then

writeln(f2,k)

else

writeln(f2,-1);

close(f2);

end.