Школьный тур Всероссийской олимпиады по программированию для учащихся 9 – 11 классов 2017-2018
Заданы две строки. Определить, являются ли они анаграммами, то есть одна строка получена из другой перестановкой букв.
Например:
строки "БУК" и "КУБ" или "СОЛЬ" и "ЛОСЬ" являются анаграммами.
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.
Даны два массива чисел. Требуется вывести в выходной файл те элементы
первого массива (в том порядке, в каком они идут в первом массиве),
которых нет во втором массиве.
Входные данные:
Во входном файле записано сначала число 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.