- •Тема: Перебор вариантов. Задача 1. Замечательные числа
- •Задача 2. Острова
- •Задача 3 Клавиатура
- •Задача 4 . Вырубка деревьев
- •Краткие методические рекомендации по решению задачи
- •Оценка решения
- •Формат входных данных
- •Формат выходных данных
- •Работа с большими числами
- •Золото племени абба
- •Сортировка и поиск
- •2. Домашнее задание.
- •Метод перебора вариантов, отсечения перебора
- •Сумма двух чисел
- •Элементы вычислительной геометрии
- •4. Две окружности
- •Эффективные структуры данных
- •5. Поиск прямоугольников (Время: 0,5 сек. Память: 16 Мб Сложность: 34%)
- •Тема 1: «Работа с длинными числами»
- •Тема 2: Алгоритмы поиска и сортировки
- •Тема 3: Аналитическая геометрия
- •Тема 4: Перебор вариантов
- •Тема 5: Строки. Элементы лексического и синтаксического разобра
- •Задача 3. "Функция"
- •Ограничения
- •Площади покрытия антенны
- •Площадь покрытия решение
- •Элементы лексического и синтаксического разбора Шифровка
- •Шифровка Решение
- •Сортировка и поиск Независимые судьи
- •Независимые судьи Решение
- •Сувениры
- •Сувениры Решение
- •Треугольник Условие задачи
- •Треугольник Решение
- •Олимпиадные задачи по информатике
- •Задача 1. «Код да Винчи»
- •Задача 3 «Буквы»
- •Задача 4 «Соревнования»
- •Задача «Красивая последовательность»
- •Тема: Задача на динамическое программирование
- •Динамическое программирование Задача: Черепашка
- •Решение
- •Тема: Работа с большими числами
- •Тема: Сортировка и выбор
- •Задача. Подземная дорога (поиск в ширину)
- •Формат входных данных
- •Задача rebus
- •Задача “Эчпочмаки”
- •Задача “Ниточка”
- •Задача “Обезьяны”
- •Задача Интересное число
Тема 4: Перебор вариантов
«Буратино в замке»
В старинный замок имеет форму квадрата N×N комнат. В каждой комнате расставлены сундуки с золотыми монетами. Буратино находится в левой верхней комнате и мечтает, собрав как можно больше монет добраться до правой нижней комнаты. С каждой комнаты он может перейти с соседнюю справа или снизу. Буратино так же хочет запомнить маршрут, который он пройдет. Помогите Буратино.
Входные данные: Input.txt. В первой строке файла находится одно число N (1≤N≤30). В каждой i-ой из следующих N строк находится N чисел, которые обозначают количество монет в комнате (i,j).
Выходные данные: Output.txt. в первую строку файла выводится одно целое число – количество монет, которые удалось собрать Буратино. Во второй строке – маршрут – номера комнат, в которых побывал Буратино, начиная с комнаты (N,N) и заканчивая комнатой (1,1).
Input.txt |
Output.txt |
5 7 1 4 9 3 3 8 4 2 1 8 1 6 7 7 2 7 4 4 5 4 5 2 6 5 |
52 (1,1) (2,1) (2,2) (2,3) (3,3) (3,4) (3,5) (4,5) (5,5) |
const
File_Dat='Input.txt';{константа хранит имя входного файла}
File_Sol='Output.txt';{константа хранит имя выходного файла}
var
X:array [1..30,1..30] of Longint;{массив для хранения количества монет в комнатах}
Y:array[0..30,0..30] of longint;{массив для хранения сумм монет при переходе}
n,i,j: byte;
begin
assign(Input, File_Dat);{связываем файловую переменную и входной файл}
reset(Input);{открываем файл для чтения}
readln(N);{считываем количество комнат на этаже}
{считываем количество монет в каждой комнате и заполняем массив}
for i:=1 to N do
for j:=1 to N do
read(X[i,j]);
close(Input);{закрываем входной файл}
{заполняем массив сумм нулями}
for i:=0 to n do
for j:=0 to n do
Y[i,j]:=0;
{Заполняем массив сумм}
for i:=1 to N do
for j:=1 to N do
if Y[i-1,j]>Y[i,j-1] then{Определяем комнату с наибольшим количеством монет}
Y[i,j]:=X[i,j]+Y[i-1,j]{записываем в массив сумм сумму монет текущей и соседней комнаты снизу}
else
Y[i,j]:=X[i,j]+Y[i,j-1];{записываем в массив сумм сумму монет текущей и соседней комнаты справа}
assign(Output,File_Sol);{связываем выходной файл и файловую переменную}
rewrite(Output);{открываем файл для записи}
writeln(Y[n,n]);{выводим максимальное количество монет}
write('(',n,',',n,')'); {вывод координат последней комнаты}
{вывод пути, обратный обход массива сумм}
i:=n;
j:=n;
s:='';
{Обход массива сумм в обратную сторону}
while (i>0) and (j>0) do
begin
if (Y[i,j]-X[i,j])=Y[i-1,j] then i:=i-1
else j:=j-1;
if (i<>0) and (j<>0) then
write(Output,'(',i,',',j,')');
end;
close(Output);
end.
Тема 5: Строки. Элементы лексического и синтаксического разобра
«Печать строк»
Сергей очень любит играть в такую игру: произвольным способом выбирает два натуральных числа
N(1≤N≤100) и M (1≤M≤100).
Создается строка символов, в которых подряд выписываются числа: сначала одна 1, потом две 2, потом три 3 и так далее до N. Например, для N=5 полученная строка такая: 122333444455555. Потом полученная строка записывается в несколько строк по M символов в строке. Последняя строка может быть неполной длинны. Например, предыдущая строка для М=3 будет иметь вид:
122
333
444
455
555
Нужно написать программу, которая освободит Сергея от подобного времяпрепровождения.
Входные данные: LINE.DAT в одной строке входного файла заданы два числа N и М, которые не превышают 100 и разделены пробелом.
Выходные данные: LINE.SOL в каждой строке выходного файла должно содержаться по М символов из полученной N строки. Последняя строка может быть неполной.
LINE.DAT |
LINE.SOL |
5 3 |
122 333 444 455 555 |
var
n, m, i, j: byte;{n - количество символов, используемых в строке, m-количество символов в одной строке вывода, i,j - переменные для счетчика цикла}
s, x: string;{s - строка символов, x - очередной символ строки}
begin
assign(input, 'LINE.dat');{связываем входной файл и файловую переменную}
reset(input);{открываем файл для чтения}
readln(n, m);{считываем входные данные}
close(Input);{закрываем входной файл}
assign(Output,'LINE.sol');{связываем выходной файл и файловую переменную}
rewrite(Output);{открываем файл для записи}
s:='';{обнуляем строку}
for i:=1 to n do {перечисляем цифры для формирования строки}
for j:=1 to i do {перечисляем количество каждой отдельной цифры}
begin
str(i,x); {переводим цифру в строку}
s:=s+x;{записываем символы в строку}
while Length(s)>=m do{выводим до тех пор пока длина строки не станет меньшей M}
begin
writeln(Copy(s,1,m));{копируем и выводим m-символов}
delete(s,1,m);{удаляем в исходной строке m символов}
end;
end;
if length(s)>0 then writeln(s);{выводим последние символы в файл}
close(Output);{закрываем файл}
end.
Тема: Метод перебора вариантов, отсечение перебора
Задача «Вырубка деревьев»
Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом. Деревья перед дворцом короля посажены в ряд, всего там растет N деревьев, расстояния между соседними деревьями одинаковы.
После вырубки перед дворцом должно остаться M деревьев, и расстояния между соседними деревьями должны быть одинаковыми. Помогите королю выяснить, сколько существует способов вырубки деревьев.
Входные данные
Входной файл INPUT.TXT содержит два целых числа M и N (0 <= M <= N <= 1000).
Выходные данные
В выходном файле OUTPUT.TXT должно содержаться одно число - искомое количество способов.
Комментарии
Требуется написать программу, которая по заданным числам N и M определит, сколько существует способов вырубки некоторых из N деревьев так, чтобы после вырубки осталось M деревьев и соседние деревья находились на равном расстоянии друг от друга.
Примечания
Зафиксируем расстояние между деревьями после вырубки. Если оно равно d, то возможно n – d(m – 1) – m + 1 способов вырубить деревья. Суммируя по всем d, получаем ответ.
Если у нас есть 0 деревьев и 0 деревьев должно остаться после вырубки, то существует один вариант вырубки - это надо учитывать при решении задачи.
INPUT.TXT |
OUTPUT.TXT |
5 3 |
4 |
Progpam 111;
var
n, m: longint;
i, d, s: longint;
input, output: text;
begin
Assign(input,'input.txt');
Reset(input);
Read (input, n, m);
Close(input);
s:=0;
if m = 0 then
s:=1
else
if m = 1 then
s:= n
else
for d:= 1 to (n-1) div (m-1) do
inc(s,n-(m-1)*d);
Assign(output,'output.txt');
Rewrite(output);
Write(output,s);
Close(output);
end.
Тема: Сортировка и выбор
Условие задачи: Для игры в квидич используются мячи - снитчи. Проблема заключается в том, что они разного размера. Для проведения матча требуется выбрать снитч нужного веса. Перед началом матча все снитчи выстраиваются в ряд в порядке неубывания весов и Гарри Поттер должен как можно быстрее найти снитч с весом ровно Х кг или сообщить судье об отсутствии нужного мяча.
Формат входных данных:
В первой строке входного файла записаны через пробел два целых числа N и X. В следующих N строках записаны веса мячей в порядке неубывания (по одному числу в строке). Веса – целые числа, не превосходящие 100, 0<N£50000.
Формат выходных данных:
В выходной файл вывести номер снитча, имеющего вес X или число 0, если такого снитча нет.
Лимит времени: 1 секунда на тест.
Пример:
-
INPUT. TXT
OUTPUT.TXT
5 3
1
3
4
5
9
2
Указания к решению. Очевидное решение состоит в просмотре всего ряда снитчей сначала до конца, что требует времени, пропорционального числу снитчей. Однако этот алгоритм не использует того факта, что веса снитчей уже отсортированы. Наилучший метод поиска состоит в том, чтобы проверить, стоит ли нужный мяч в середине ряда. Если да, то ответ получен. Если вес x меньше веса среднего снитча, то мы можем применить тот же метод поиска к отсортированному подряду слева от среднего элемента; аналогично, если x больше веса среднего мяча, то в дальнейшем мы будем рассматривать правую половину ряда.
Код возможного решения:
program tt;
const bl = 32;
type mass = array [1..bl] of integer;
var i, n, h, x : integer;
a : mass;
input, output : text;
function snwe (a : mass; st, n, x, h : integer) : integer;
var i, br : integer;
begin
br:=round ((n-st)/2);
h:=br+st;
if (br = 0) then
begin
snwe:=0;
exit;
end;
if (a[h] = x) then
begin
snwe:=h;
end
else
begin
if (a[h] > x) then
begin
n:=n-br;
end
else
begin
st:=st+br;
end;
snwe:=snwe (a, st, n, x, h);
end;
end;
begin
assign (input, 'c:\input.txt');
assign (output, 'c:\output.txt');
filemode:=2;
reset (input);
rewrite (output);
read (input, n, x);
for i:=1 to n do
begin
read (input, a[i]);
end;
close (input);
write (output, snwe (a, 1, n, x, h));
close (output);
end.
Тема: Элементы лексического и синтаксического разбора
Заданы две фразы. Определить наибольшую последовательность отличных от пробелов символов, входящую в обе фразы в одном и том же порядке.
Входные данные. В первой строке входного файла INPUT.TXT содержится первая фраза, во второй строке содержится вторая фраза.
Выходные данные. В файл OUTPUT.TXT выводится найденная последовательность символов.
Пример.
INPUT.TXT |
OUTPUT.TXT |
ПРИШЛА ВЕСНА РАССТАЯЛ СНЕГ |
РЛСН |
Решение
Program F1;
const k=255;
input='input.txt';
output='output.txt';
var x: array [1..k] of integer;
m,n,j: integer;
s1,s2,s: string;
f:text;
label 1;
{функция, которая на основе очередного сочетания
получает следующее по порядку сочетание}
function posl(m:integer):boolean;
var j,f:integer;
label 10,20;
begin
f:=0;
posl:=true;
for j:=m downto 1 do
if x[j]=n+j-m then f:=j
else
begin
inc(x[j]);
goto 10
end;
10: if f<>0 then if f=1 then
begin
posl:=false;
goto 20
end
else for j:=f to m do x[j]:=x[f-1]+j-f+1;
20:
end;
{процедура вывода результата на экран и записи в файл}
procedure prints(m:integer);
var i:integer;
z:string;
begin
write(m,': ');
for i:=1 to m do
z:=z+s1[x[i]];
writeln(z);
assign(f,output);
rewrite(f);
write(f,z);
close(f);
readln;
end;
{функция spc удаляет из переданной в неё строки пробелы.}
function spc(s:string):string;
var str:string;
i:integer;
begin
str:='';
for i:=1 to length(s) do
if s[i]<>' ' then str:=str+s[i];
spc:=str;
end;
{функция equal проверяет, входит ли очередная последовательность,
составленная из символов одной строки в другую}
function equal(m:integer):boolean;
var i,j:integer;
begin
j:=1;
for i:=1 to length(s2) do
if (s1[x[j]]=s2[i])and(j<=m) then j:=j+1;
if j>m then equal:=true else equal:=false;
end;
{тело программы}
begin
assign(f,input);
reset(f);
readln(f,s1);
read(f,s2);
close(f);
s1:=spc(s1); s2:=spc(s2);
if (length(s2)<length(s1)) then begin s:=s1; s1:=s2; s2:=s end;
n:=length(s1);
for m:=n downto 1 do
begin
for j:=1 to m do x[j]:=j;
repeat
if equal(m) then
begin
prints(m);
goto 1;
end;
until not posl(m);
end;
1:
end.
В этой программе процедура prints печатает найденную последовательность символов и её длину, функция equal проверяет, входит ли очередная последовательность, составленная из символов одной строки в другую, функция spc удаляет из переданной в неё строки пробелы. Работу полученной программы можно значительно ускорить, если добавить в неё часть, в которой перед началом перебора из обеих строк удалялись бы те символы, которые встречаются только в одной из них. (Например, заданные в условии строки после такого преобразования приняли бы вид: РЛАЕСНА и РАСАЛСНЕ).
Тема: Эффективные структуры данных
Условие задачи: В арифметическом выражении разрешается использовать только число 1, действия сложения и умножения и скобки. Какое минимальное количество единиц необходимо использовать, чтобы получить заданное натуральное число N (1≤ N ≤ 5000)?
INPUT. TXT |
11 |
Значение N |
OUTPUT.TXT |
8 |
Минимальное количество единиц |
Комментарии: Для решения данной задачи применяем методы «динамических структур», т.е. для того, чтобы найти ответ для N, сначала необходимо найти наименьшее количество единиц для значений 1..N-1. Рассмотрим соответствующие выражения для нескольких начальных значений N:
Значение N |
Наименьшее количество 1 |
Арифметическое выражение |
1 |
1 |
1 |
2 |
2 |
1+1 |
3 |
3 |
1+1+1 |
4 |
4 |
(1+1)*(1+1) |
5 |
5 |
1+ (1+1)*(1+1) |
6 |
5 |
(1+1)*(1+1+1) |
7 |
6 |
1+(1+1)*(1+1+1) |
Динамическая структура строится следующим образом:
для N=1 количество единиц будет x[1]=1;
каждое следующее x[N] будет наименьшим из двух величин:
a=x[N-1]+1;
b=min(x[i] + x[N div i]).
Самого арифметического выражения программа не выдает, только минимальное количество единиц.
Решение:
Program olimp2;
сonst
_N=5000;
var
N: integer;
x: array[1.._N] of byte;
fD, fs: Text;
procedure init;
begin
assign(fD, ‘D:\input.txt’);
reset(fD);
readln(fD, N);
close(fD);
end;
procedure Run;
var i, a, b, m: word;
begin
Fillchar(x, Sizeof(x), 0);
x[1]:=1;
for M:=2 to N do
begin
a:=N;
for i:=1 to M div 2 do
if x[i] +x[M-i]< a then a:=x[i]+x[M-i];
b:=N;
for i:=2 to M div 2 do
if (M mod i=0) and (x[i]+x[M div i]<b) then b:=x[i]+x[M div i];
if a<b then x[M]:=a else x[M]:=b;
end;
end;
procedure Done;
begin
assign (fs, ‘D:\output.txt’);
rewrite(fs);
write(fs, x[N]);
close(fs);
end;
begin
init;
run;
done
end.
Тема: Работа с большими числами
Условие задачи: Гарри Поттер на досуге занимается исследованием свойств чисел. Однажды ему захотелось узнать факториал числа 100. Напишите программу, помогающую Гарри решить эту проблему для любого N (0<N<103).
Формат входных данных:
Исходный файл содержит одно число N.
Формат выходных данных:
В выходной файл вывести факториал заданного числа
Пример:
-
INPUT.TXT
OUTPUT.TXT
50
30414093201713378043612608166064768844377641568960512000000000000
program Factorial;
type tlargenumber=record
number:array[1..3000]of byte;
power:word;
end;
var fact:tlargenumber;
n:word;
i:word;
f:text;
procedure product(n:word);
var temp:tlargenumber;
i,p:word;
procedure add(n:word;power:word);
var t,s,d,e:byte;
first:word;
begin
t:=n div 1000;
s:=(n mod 1000)div 100;
d:=(n mod 100)div 10;
e:=n mod 10;
first:=1+power;
inc(temp.number[first],e);
inc(temp.number[first+1],d+(temp.number[first]div 10));
temp.number[first]:=temp.number[first]mod 10;
inc(temp.number[first+2],s+(temp.number[first+1]div 10));
temp.number[first+1]:=temp.number[first+1]mod 10;
inc(temp.number[first+3],t+(temp.number[first+2]div 10));
temp.number[first+2]:=temp.number[first+2]mod 10;
inc(temp.number[first+4],temp.number[first+3]div 10);
temp.number[first+3]:=temp.number[first+3]mod 10;
end;
begin
for i:=1 to 3000 do temp.number[i]:=0;
temp.power:=0;
p:=fact.power;
for i:=0 to p do
add(fact.number[i+1]*n,i);
if temp.number[p+4]<>0 then temp.power:=p+4
else
if temp.number[p+3]<>0 then temp.power:=p+3
else
if temp.number[p+2]<>0 then temp.power:=p+2
else
if temp.number[p+1]<>0 then temp.power:=p+1
else
temp.power:=p;
fact:=temp;
end;
begin
assign(f,'in.txt');
reset(f);
read(f,n);
close(f);
fact.number[1]:=1;
fact.power:=1;
for i:=2 to n do
begin
product(i);
end;
assign(f,'out.txt');
rewrite(f);
for i:=fact.power downto 1 do write(f,fact.number[i]);
close(f);
end.
Задача «Треугольник»
Input file: input.txt
Output file: output.txt
В файле in.txt даны координаты трех вершин A,B и С на трех строках соответственно. Координаты в файле разделены пробелом.
Необходимо определить существует ли треугольник АВС с указанными координатами вершин. Если существует, то вывести в файл out.txt слово «exist», иначе – «do not exist».
INPUT.TXT |
OUTPUT.TXT |
1 3 5 7 8 9 |
exist |
Решение
Program triangle;
var
i,xa,xb,xc,ya,yb,yc,xAB,xBC,yAB,yBC: integer;
AB,BC: real;
f1,f2: text;
begin
assign(f1,'input.txt');
assign(f2,'output.txt');
reset(f1);
read(f1,xa,ya);
readln(f1);
read(f1,xb,yb);
readln(f1);
read(f1,xc,yc);
readln(f1);
close(f1);
xAB:=xb-xa;
yAB:=yb-ya;
xBC:=xc-xb;
yBC:=yc-yb;
rewrite(f2);
if xAB/xBC <> yAB/yBC then writeln(f2,'exist')
else writeln(f2,'do not exist');
close(f2);
end.
Тема: Эффективные структуры данных.
Условие задачи: В преддверии начала 13-го чемпионата страны по футболу в 1-й лиге организаторы решили провести жеребьевку календаря. Секретарь федерации предоставил списки команд с учетом занятых мест в 12-м чемпионате, но для того, чтобы жеребьевка прошла непредвзято и корректно необходимы списки команд по алфавиту, независимо от их достижений в прошлом году. Составить программу, преобразующую турнирную таблицу 12-го чемпионата, состоящую из N команд, в алфавитный список.
INPUT. TXT |
8 Реал Барселона Атлетико Депортиво Сельта Севилья Гранада Валенсия
|
Количество команд (N)
Названия команд |
OUTPUT.TXT |
Атлетико Барселона Валенсия Гранада Депортиво Реал Севилья Сельта |
|
Решение:
Program olimp1;
var
x: array[1..32] of string;
y: string;
i, j, n: integer;
Fd, Fs: Text;
begin
assign(Fd, ‘D:\input.txt’);
reset(Fd);
assign(Fs, ‘D:\output.txt’);
rewrite(Fs);
readln(Fd, N);
for i:=1 to N do
begin
readln(Fd, x[i]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if x[i]>x[j] then
begin
y:=x[i];
x[i]:=x[j];
x[j]:=y;
end;
for i:=1 to n do
writeln (Fs, i:2,’.’+x[i]);
end.
Задача 1 Волшебники Гарри Поттера
У Эрни Макмиллана есть список тех, с кем разговаривал Долиш. Он говорил одинаковое количество времени с несколькими волшебниками. Нужно вначале в список поместить тех, у кого меньше магических способностей. Если же и магические способности у них одинаковы, то вывести их в том порядке, в котором они находятся в телефонном справочнике.
Формат входных данных
В первой строке входного файла находится натуральное число N, которое не меньше 1 и не превосходит 1000
В каждой из последующих N строк ― разделенные пробелами фамилия человека (строка из заглавных и строчных латинских букв, длиной не более 50 символов), время его разговора с Долишем и его магические способности (неотрицательные целые числа, не превосходящие 106
Формат выходных данных
Вывести список в указанном порядке, по одной фамилии на строку.
Входные данные в файле input.txt |
Результат работы в файле output.txt |
6 Dumbledore 0 1000 Riddle 0 900 Grindelwald 0 900 Potter 1 950 Smith 20 500 JohnDoe 10 0 |
Smith JohnDoe Potter Grindelwald Riddle Dumbledore |
Условно решение можно разделить на три части: объявление процедур и переменных, считывание входных данных и само тело программы.
// ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
type
zvonki = record {Задаем запись}
name: string;
time: integer;
pow: integer;
end;
var
wizard: array [1..10000] of zvonki; {масссив записей}
I, n, j, tmp, ps, kod: integer;
tmp1, s, times: string;
// ПРОЦЕДУРЫ
procedure time_sort(x: integer);{ процедуры обмена значениями двух переменных}
begin
tmp := wizard[x].time;
wizard[x].time := wizard[x + 1].time;
wizard[x + 1].time := tmp;
end;
procedure power_sort(x: integer);
begin
tmp := wizard[x].pow;
wizard[x].pow := wizard[x + 1].pow;
wizard[x + 1].pow := tmp;
end;
procedure names_sort(x: integer);
begin
tmp1 := wizard[x].name;
wizard[x].name := wizard[x + 1].name;
wizard[x + 1].name := tmp1;
end;
begin
// СЧИТЫВАНИЕ ИЗ ФАЙЛА
assign(input, 'input.txt'); reset(input); {открываем input.txt}
assign(output, 'output.txt'); rewrite(output);
readln(n); {считываем количество волшебников}
for I := 1 to n do
begin
readln(s); {считываем всю строку из файла.}
PS := Pos(' ', s); {функция pos() определяет позицию любого символа в строке. если символов несколько, выводит координату первого}
wizard[I].name := Copy(S, 1, PS - 1); {Копируем имя без пробела}
Delete(s, 1, PS); {Удаляем имя с пробелом}
PS := Pos(' ', S); {Определяем позицию пробела}
times := Copy(S, 1, PS - 1); {Копируем строку во временную переменную}
Val(times, wizard[I].time, kod); {Используем стандартную функцию преобразования типов.}
Delete(S, 1, PS); {Удаляем все лишнее}
Val(S, wizard[I].pow, kod); {Трансформируем оставшуюся строку в целое число.}
end;
// ТЕЛО ПРОГРАММЫ
for I := 1 to n - 1 do {сортируем пузырьком}
for j := 1 to n - i do
begin
if wizard[j + 1].time > wizard[j].time then {Если время разговора волшебника больше времени следующего волшебника}
begin
time_sort(j); {обмениваем значения времени}
names_sort(j); {обмениваем значения имен}
power_sort(j); {обмениваем значения сил. таким образом мы перемещаем волшебника с меньшим временем разговора вниз}
end;
if wizard[j + 1].time = wizard[j].time then begin{Если время разговора волшебников одинаково, то}
if wizard[j + 1].pow < wizard[j].pow then {Если сила одного меньше силы другого, то}
begin
power_sort(j); {обмениваем значения сил}
names_sort(j); {обмениваем значения имен}
// Время у них и так одинаковое, поэтому нет смысла производить обмен времени.
end
else
if wizard[j + 1].pow = wizard[j].pow then {Если же сила у них равна}
if wizard[j + 1].name < wizard[j].name then {Сравниваем имена.}
names_sort(j); {обмениваем значения имен}
// Время и сила у них одинаковое, поэтому мы обмениваем только имена.
end;
end;
// ВЫВОД
for i := 1 to n do writeln(output, wizard[i].name);
close(input);
close(output);
end.
Задача 2 " Язык TURBU "
языке TURBU алфавит содержит 5 букв: "#", "$", "&","*","@".
Все используемые в языке слова - пятибуквенные, поэтому в словаре языка TURBU первое слово - #####, последнее - @@@@@. На каждой странице словаря напечатано N слов.
Определить:
1.Количество страниц Р, необходимое для размещения всех слов языка TURBU в словаре.
Номер Q страницы, на которой располагается задаваемое слово а.
3.Слова, которыми начинается и заканчивается страница, содержащая задаваемое слово b языка TURBU.
Входные данные. Входной текстовый файл input.txt содержит: в первой строке - число N, во второй - слово а, в третьей - слово b.
Выходные данные. Выходной текстовый файл output.txt должен содержать:
в первой строке - число страниц Р; во второй строке - номер Q страницы, содержащей слово а; в третьей строке - первое слово на
странице, содержащей слово b;в четвертой строке - последнее слово на странице, содержащей слово b.
input.txt |
output.txt |
||
N |
35 |
P |
90 |
a |
####$ |
Q |
1 |
b |
###$$ |
##### |
|
|
|
##$$@ |
|
Type num5=string;
var a,b:num5;
n:integer;
p:integer;
Function To5(x:integer):num5;
{перевод числа в слово из языка TURBU} var s:num5;
r:string;
k:integer;
begin
s:='';
While x>0 do
begin
k:=x mod 5;
x:=x div 5;
case k of
0:r:='#';
1:r:='$';
2:r:='&';
3:r:='*';
4:r:='@';
else Writeln('Error!!!!!')
end;
s:=r+s;
end;
To5:=s;
end;
Procedure ReadFile;
{чтение исходных данных из файла Input.txt:
- число слов на странице
a- первое слово
b- второе слово }
var s:string;
f:text;
begin
Assign(f,'input.txt');
Reset(f);
Readln(f,n);
Readln(f,a);
Readln(f,b);
Close(f);
end;
Function To10(x:string):integer;
k:=x mod 5;
x:=x div 5;
case k of
0:r:='#';
1:r:='$';
2:r:='&';
3:r:='*';
4:r:='@';
else Writeln('Error!!!!!')
end;
s:=r+s;
end;
To5:=s;
end;
Procedure ReadFile;
{чтение исходных данных из файла Input.txt:
- число слов на странице
a- первое слово
b- второе слово }
var s:string;
f:text;
begin
Assign(f,'input.txt');
Reset(f);
Readln(f,n);
Readln(f,a);
Readln(f,b);
Close(f);
end;
Function To10(x:string):integer;
begin
While length(s)<5 do s:='#'+s; end;
Procedure WriteToFile;
{запись в файл Output.txt и расчет выходных данных}
var ttt,q,p:integer;
s1,s2:num5;
f:text;
begin
Assign(f,'output.txt');
Rewrite(f);
{расчет необходимого количества страниц} p:=Trunc(3125/n+0.999999); Writeln(f,p);
{расчет номера страницы, на которой находиться слово a}
q:=To10(a) div n + 1;
Writeln(f,q);
{получение первого слова на странице, на которой находиться
слово b}
ttt:=(To10(b) div n)*n;
s1:=To5(ttt);
{добавление в начало полученного слова нулевых символов языка TURBU}
DoLen5(s1);
Writeln(f,s1);
{получение последнего слова на странице, на
которой находиться
слово b}
ttt:=(To10(b) div n)*n+n-1; if ttt>3124 then ttt:=3124; s2:=To5(ttt);
{добавление в начало полученного слова нулевых символов языка TURBU}
DoLen5(s2);
Writeln(f,s2);
Close(f);
end;
{основная программа}
BEGIN
ReadFile;
WriteToFile;
END.
