Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Банк олимпиадных заданий.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
374.86 Кб
Скачать

Тема 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

Условно решение можно разделить на три части: объявление процедур и переменных, считывание входных данных и само тело программы.

  1. // ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ

  2. type

  3. zvonki = record {Задаем запись}

  4. name: string;

  5. time: integer;

  6. pow: integer;

  7. end;

  8.  

  9. var

  10. wizard: array [1..10000] of zvonki; {масссив записей}

  11. I, n, j, tmp, ps, kod: integer;

  12. tmp1, s, times: string;

  13.  

  14. // ПРОЦЕДУРЫ

  15. procedure time_sort(x: integer);{ процедуры обмена значениями двух переменных}

  16. begin

  17. tmp := wizard[x].time;

  18. wizard[x].time := wizard[x + 1].time;

  19. wizard[x + 1].time := tmp;

  20. end;

  21.  

  22. procedure power_sort(x: integer);

  23. begin

  24. tmp := wizard[x].pow;

  25. wizard[x].pow := wizard[x + 1].pow;

  26. wizard[x + 1].pow := tmp;

  27. end;

  28.  

  29. procedure names_sort(x: integer);

  30. begin

  31. tmp1 := wizard[x].name;

  32. wizard[x].name := wizard[x + 1].name;

  33. wizard[x + 1].name := tmp1;

  34. end;

  35.  

  36. begin

  37.  

  38. // СЧИТЫВАНИЕ ИЗ ФАЙЛА

  39. assign(input, 'input.txt'); reset(input); {открываем input.txt}

  40. assign(output, 'output.txt'); rewrite(output);

  41. readln(n); {считываем количество волшебников}

  42. for I := 1 to n do

  43. begin

  44. readln(s); {считываем всю строку из файла.}

  45. PS := Pos(' ', s); {функция pos() определяет позицию любого символа в строке. если символов несколько, выводит координату первого}

  46. wizard[I].name := Copy(S, 1, PS - 1); {Копируем имя без пробела}

  47. Delete(s, 1, PS); {Удаляем имя с пробелом}

  48. PS := Pos(' ', S); {Определяем позицию пробела}

  49. times := Copy(S, 1, PS - 1); {Копируем строку во временную переменную}

  50. Val(times, wizard[I].time, kod); {Используем стандартную функцию преобразования типов.}

  51. Delete(S, 1, PS); {Удаляем все лишнее}

  52. Val(S, wizard[I].pow, kod); {Трансформируем оставшуюся строку в целое число.}

  53. end;

  54. // ТЕЛО ПРОГРАММЫ

  55. for I := 1 to n - 1 do {сортируем пузырьком}

  56. for j := 1 to n - i do

  57. begin

  58. if wizard[j + 1].time > wizard[j].time then {Если время разговора волшебника больше времени следующего волшебника}

  59. begin

  60. time_sort(j); {обмениваем значения времени}

  61. names_sort(j); {обмениваем значения имен}

  62. power_sort(j); {обмениваем значения сил. таким образом мы перемещаем волшебника с меньшим временем разговора вниз}

  63. end;

  64. if wizard[j + 1].time = wizard[j].time then begin{Если время разговора волшебников одинаково, то}

  65. if wizard[j + 1].pow < wizard[j].pow then {Если сила одного меньше силы другого, то}

  66. begin

  67. power_sort(j); {обмениваем значения сил}

  68. names_sort(j); {обмениваем значения имен}

  69. // Время у них и так одинаковое, поэтому нет смысла производить обмен времени.

  70. end

  71. else

  72. if wizard[j + 1].pow = wizard[j].pow then {Если же сила у них равна}

  73. if wizard[j + 1].name < wizard[j].name then {Сравниваем имена.}

  74. names_sort(j); {обмениваем значения имен}

  75. // Время и сила у них одинаковое, поэтому мы обмениваем только имена.

  76. end;

  77. end;

  78. // ВЫВОД

  79. for i := 1 to n do writeln(output, wizard[i].name);

  80. close(input);

  81. close(output);

  82. end.

Задача 2 " Язык TURBU "

  • языке TURBU алфавит содержит 5 букв: "#", "$", "&","*","@".

Все используемые в языке слова - пятибуквенные, поэтому в словаре языка TURBU первое слово - #####, последнее - @@@@@. На каждой странице словаря напечатано N слов.

Определить:

1.Количество страниц Р, необходимое для размещения всех слов языка TURBU в словаре.

  1. Номер 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:

  1. - число слов на странице

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:

  1. - число слов на странице

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.