.RU

Задача 1 «Расшифровка»



Cборник Олимпиадных Задач стр. из 65 Шедько В.В

Задача 1 «Расшифровка»

Задан исходный текст, который зашифрован заменой русских букв путем их циклического сдвига в алфавите на равное порядковому номеру зашифровываемой буквы в алфавите число позиций по кольцевому принципу (например: А меняется на Б (на 1 позицию), Б на Г (2 позиции), Я на Я(33 позиции)). Написать программу, расшифровывающую исходный текст.

Ввод: Строка – исходный, зашифрованный текст из русских букв.

Вывод: Строка – расшифрованный текст.

Пример:

Ввод: Вывод:
^ Гбгб Яжб Баба Яга
Задача 1.

Составляем шаблоны, отдельно для больших и малых русских букв, так, чтобы буквы в них следовали в алфавитном порядке. Составляем алгоритм зашифровки текста по описанным в условии правилам, а затем с его помощью получаем два, соответствующих шаблонам, ключа для расшифровки текстов. Ключи получаются зашифровкой шаблонов при помощи алгоритма зашифровки. Читаем зашифрованный текст и расшифровываем его посимвольно: берем символ из зашифрованного текста, находим его порядковый номер в одном из ключей, а затем, в качестве расшифрованного символа берем символ, с таким же номером в соответствующем ключу исходном шаблоне.

^ Program Zadaha01;

Var i,j,k:word; NSI,NSU,SS,S1,S2,BB,MB,BRK,MRK:string;

Function Chifr(X:string):string;

Begin S2:='';

for i:=1 to length(X) do begin

k:=2*Pos(X[i],BB)+2*Pos(X[i],MB);

if k>33 then k:=k-33;

if Pos(X[i],BB)0 then S1:=BB[k];

if Pos(X[i],MB)0 then S1:=MB[k];

S2:=S2+S1; end;

Chifr:=S2;

end;

Begin

BB:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ'; BRK:=Chifr(BB);

MB:='абвгдеёжзийклмнопрстуфхцчшщьыъэюя'; MRK:=Chifr(MB);

^ Readln(SS); S2:='';

for i:=1 to length(SS) do begin S1:=SS[i];

if Pos(SS[i],BB)0 then S1:=BB[(Pos(SS[i],BRK))];

if Pos(SS[i],MB)0 then S1:=MB[(Pos(SS[i],MRK))];

S2:=S2+S1; end;

Writeln(S2);

end.


Задача 2 «Арифметика автомобильных номеров»

Автомобильный номер состоит из четырех цифр и двух латинских букв. Поставив между цифрами и буквами знак равно, будем рассматривать пару букв как число в римской системе нумерации, а между парами цифр разрешим ставить знаки математических действий: плюс, минус, умножить (ПРИМЕР: 00 +02). Знак между цифрами ставить не обязательно. Составить алгоритм, выводящий максимальное количество возможных различных, верных равенств, для введенной буквенной серии номеров.

Краткие правила римской нумерации: Числа от 1 до 10 : 1 - I; 6 - VI; 2 - II; 7 - VII; 3 - III; 8 - VIII; 4 - IV; 9 - IX; 5 - V; 10 - X. Десятки записываются по тем же правилам, только вместо I используется Х, вместо V используется L - 50, вместо Х используется : С - 100. Для записи сотен используются символы C, D - 500 и М - 1000 соответственно. Меньшая цифра стоящая слева от большей этого же разряда вычитается, а справа – прибавляется, число вычисляется как сумма разрядов. Вычитать разрешено не более одной младшей для данного разряда цифры. В случае ввода серии из букв, которым не соответствует корректного римского числа выдать результат «0».

Ввод: Строка из двух больших латинских букв.

Вывод: максимальное число возможных различных, верных равенств соответствующее введенной буквенной серии номеров.

Пример :

Ввод: Вывод:

CM 14

Задача 2.

Задача решается поэтапно: сначала - проверка существования правильного римского числа, соответствующего введенной паре букв, если числа нет, то выдать в качестве результата «0», а при наличии такого числа, перевод его в арабскую форму записи, а затем, следующий этап - поиск и подсчет количества всевозможных решений для найденного числа. Поиск и подсчет всевозможных решений осуществляем методом полного перебора для всех возможных чисел (от 00 до 99) и всех возможных знаков между ними. Для данной задачи проверку корректности двухзначного римского числа и его перевод можно так же осуществить методом полного перебора и исключения недопустимых вариантов (18 случаев) римского числа из допустимых римских цифр, случай когда одна из введенных букв не является римской цифрой, распознается и решается еще проще предыдущего.

^ Program Zadaha02;

Var D: array [1..2] of longint;

i,T,p,a,b,c,w:longint; SS:string[2];

Begin

readln(SS);

for i:=1 to 2 do case SS[i] of

'I': D[i]:=1;

'V': D[i]:=5;

'X': D[i]:=10;

'L': D[i]:=50;

'C': D[i]:=100;

'D': D[i]:=500;

'M': D[i]:=1000;

else D[i]:=0;

end;

p:=0;T:=0; if (D[1]*D[2]>0) then begin if (D[1]>=D[2]) then

begin if (SS='VV')or(SS='LL')or(SS='DD') then p:=1 else C:=D[1]+D[2];end

else if (SS='IV')or(SS='IX')or(SS='XL')or(SS='XC')or(SS='CD')or(SS='CM')

then C:=D[2]-D[1] else p:=1; if p=0 then

for a:=0 to 99 do for b:=0 to 99 do for w:=0 to 3 do

case w of

0: if a+b=C then inc(T);

1: if a-b=C then inc(T);

2: if a*b=C then inc(T);

3: if a*100+b=C then inc(T);

end;

end;

Writeln(T);

end.


Задача 3 «Разрезание листа»

Прямоугольный лист бумаги складывают N раз пополам, сгибая параллельно сначала одной, а затем другой из взаимно перпендикулярных сторон, (т.е. пополам, получившуюся фигуру еще пополам и т.д.), а затем разрезают получившуюся в результате складывания фигуру по диагонали. Составить алгоритм, выводящий максимальное количество частей, на которое может распасться сложенный и разрезанный таким образом лист, если N – натуральное число не превосходящее 32.

Ввод : N – число складываний листа.

Вывод: максимальное число частей, на которое может распасться сложенный лист после разрезания.

Пример :

Ввод: Вывод:

5 23

Задача 3.

Форма и начальные пропорции листа не влияют на результат. Каждое складывание листа уменьшает один из его размеров в два раза, при этом каждый из размеров уменьшается поочередно, а конечные размеры сложенного разрезаемого листа будут зависеть от четности - нечетности числа складываний - N. Влияет на результат и вид разрезания: диагонали у сложенного листа две, и - разрезание по одной из них приводит к тому, что линия разреза проходит через центр сложенного листа, разрезание по второй - оставляет центр нетронутым, легко убедиться, что во втором случае лист распадется на большее число кусочков, чем в первом (можно убедиться практически для малых N, например, для 2 складываний: 1-й способ разрезания - лист распадается на 4 кусочка, 2-й способ на 5 кусочков). Эта закономерность справедлива для любых N и далее нас будет интересовать лишь второй способ. Записав для четных и нечетных N длины сторон сложенного прямоугольника через длины сторон исходного, посмотрев сколько раз одни помещаются в других, можно вывести формулы числа кусочков для четных и нечетных N: К=2^( n-1)+2^( n/2)+1 - для четных и - К=2^(n-1)+2^((n-1)/2)+2^((n-3)/2)+1 - для нечетных. Из формул видно, что для точных расчетов по ним для N >31 нужна длинная арифметика, реализуем ее и выводим результат.

^ PROGRAM Zadaha03;

const z=28;

type DH=array[1..z] of longint;

var i,j,N:integer; SL1,SL2:DH;


PROCEDURE SUM(MD1,MD2:DH; var RMU:DH);

Var mi:byte;Per:longint;

begin Per:=0;for mi:=1 to z do begin

RMU[mi]:=(MD1[mi]+MD2[mi]+Per) mod 1000000000;

Per:=(MD1[mi]+MD2[mi]+Per) div 1000000000;

end;end;


PROCEDURE ZERO(var VV:DH);

Var m1:byte;

begin for m1:=1 to z do VV[m1]:=0;end;


PROCEDURE WYWOD(var WV:DH);

Var ii:integer;SH:string;

Begin

ii:=z; While (WV[ii]=0)and(ii>0) do Dec(ii);

if ii=0 then writeln(0) else begin

write(WV[ii]);Dec(ii);

While ii>0 do begin

if WV[ii]>=100000000 then write(WV[ii]:9) else

begin Str(WV[ii],SH); While length(SH)<9 do SH:='0'+SH;

write(SH:9);end;

Dec(ii);end;

writeln;

end;

end;


BEGIN

readln(N);

if N=1 then Writeln(3) else begin

ZERO(SL1); ZERO(SL2); SL1[1]:=1; SL2[1]:=1;

if N mod 2 = 0 then

BEGIN for i:=1 to N div 2 do SUM(SL1,SL1,SL1);

SUM(SL1,SL2,SL2); END else begin

for i:=1 to (N-3) div 2 do SUM(SL1,SL1,SL1); SUM(SL1,SL2,SL2);

for i:=((N-3) div 2)+1 to (N-1) div 2 do SUM(SL1,SL1,SL1);

SUM(SL1,SL2,SL2); end;

for i:=(N div 2)+1 to N-1 do SUM(SL1,SL1,SL1); SUM(SL1,SL2,SL2);

WYWOD(SL2);

end;

end.


Задача 4 «КВН»

В КВН участвовали три команды: “BIM”, “BOM” и “BUM”. В перечисленном порядке вводится количество баллов, набранное командами. Написать программу, которая выдавала название команды (или команд), которые заняли второе место в КВН, а при отсутствии таковых выдавала сообщение “NO”.

Ввод: B1 B2 B3 - разделенные пробелами количества баллов набранных командами BIM, BOM, BUM – соответственно.

Вывод: название команды (команд), занявших 2-е место, или сообщение “NO”.

Пример :

Ввод: Вывод:

10 12.5 16 BOM

Задача 4.

Для успешного решения нужно предусмотреть и аккуратно реализовать их правильный перебор, для всех возможных случаев количества баллов (в том числе равенства баллов у нескольких команд) и соответствующих баллам мест команд.

program Zadaha04;

var

bim,bom,bum:real;

K:Boolean;

begin

readln(bim,bom,bum);

K:=(bim=bom)AND(bom=bum);

if K then writeln('NO');

K:=((bimbum))or((bim>bom)AND(bim
if K then writeln('BIM');

K:=((bombum))or((bom>bim)AND(bom
if K then writeln('BOM');

K:=((bumbom))or((bum>bim)AND(bum
if K then writeln('BUM');

K:=(bom=bim)AND(bum>bom);

if K then writeln('BIM BOM');

K:=(bom=bum)AND(bim>bom);

if K then writeln('BOM BUM');

K:=(bim=bum)AND(bom>bim);

if K then writeln('BIM BUM');

end.


Задача 5 «Поезд»

Последовательно вводятся количества пассажиров, которые едут в каждом из N одинаковых вагонов поезда. Написать программу, которая выдавала бы номера вагонов, в которых наибольшее количество свободных мест. Ввод корректен.

Ввод: N K – количество вагонов и количество мест в вагоне,

Х1 Х2 X3 Х4 Х5 Х6 Х7 - разделенные пробелами количества пассажиров в вагонах.

Вывод: разделенные пробелами номера вагонов с наибольшим количеством свободных мест.

Пример :

Ввод: Вывод:

55 33 44 55 77 32 55 6

Задача 5.

Задача требует внимательности: что дано и что надо найти, и предусмотреть, что ответов может быть не один, а несколько и все их вывести.

program Zadaha05;

var

i,M:word; t:ARRAY[1..7] of word;

begin

for i:=1 to 7 do read(t[i]);readln;

M:=t[1];

for i:=1 to 7 do

if t[i]
for i:=1 to 7 do

if t[i]=M then write(i:2);

writeln;

end.


Задача 6 «Спортсмен»

В этом месяце спортсмен пробегает на каждой тренировке дистанцию в М км.. Известно, что каждый месяц длина дистанции возрастает на Р %. Написать программу, которая вычисляет, сколько месяцев назад длина пробегаемой за тренировку дистанции составляла Y км., если входные данные не корректны - вывести сообщение “NO”.

Ввод: М Y Р - длины дистанций сейчас и некоторое время назад и процент их увеличения.

Вывод: число - сколько месяцев назад дистанция была Y км. или сообщение - NO

Пример :

Ввод: Вывод:

4.630400 4.000000 5.000000 3

Задача 6.

Для решения задачи требуется не начислять, а снимать заданные проценты с числа.

program Zadaha06;

var

x,y,p:real; t:word;

begin

readln(x,y,p); t:=0;

if (x
begin

while x>y do begin

x:=x/(1+p/100); t:=t+1;

end;

writeln(t:4);

end;

end.


Задача 7 «Вычитание дробей»

Заданы две правильные (числитель меньше знаменателя), несократимые арифметические дроби. Написать программу, которая вычисляла бы разность между большей и меньшей из дробей и выдавала ответ в виде правильной, несократимой арифметической дроби. Числители и знаменатели дробей - натуральные числа не превышающие 46340. Ввод корректен.

Ввод: С1 Z1 С2 Z2 - разделенные пробелами числители и знаменатели первой и второй дробей соответственно.

Вывод: С и Z - разделенные пробелом числитель и знаменатель дроби-результата.


Пример :

Ввод: Вывод:

5 24 3 16 1 48

Задача 7.

Решение задачи требует аккуратной алгоритмизации правила вычитания и сокращения дробей, предусмотрев при этом, чтобы не выйти за пределы целочисленных типов и обойтись без длинной арифметики, вычисление НОД и сокращение на него раньше, чем делается действие умножение.

program Zadaha07;

var C1,C2,C,Z1,Z2,Z,M1,M2:longint;

^ Function NOD(A,B:longint):longint;

begin

IF (A=0) or (B=0) then NOD:=1 else

begin

While AB do

if A>B then A:=A-B else B:=B-A;

NOD:=A;

end;

end;

begin

READLN(C1,Z1,C2,Z2);

M1:=Z2 div (NOD(Z1,Z2));

M2:=Z1 div (NOD(Z1,Z2));

C:=abs(C1*M1-C2*M2);

Z:=M1*Z1;

Writeln(C div (NOD(C,Z)):6, Z div (NOD(C,Z)):6);

end.


Задача 8 «Разные отрезки»

Отрезок на плоскости задан координатами его концов. Написать программу, которая вычисляла бы количество различных отрезков, целиком лежащих на данном отрезке, обе координаты концов, которых - целочисленные. Концы принадлежат отрезкам.

Ввод:Х1 Y1 X2 Y2 - разделенные пробелами координаты концов отрезка.

Вывод: число - результат.

Пример :

Ввод: Вывод:

0.5 0.5 -3.3 -3.3 6

Задача 8.

Решение задачи состоит из двух частей: первая - нахождение количества точек, имеющих обе целочисленные координаты, и принадлежащих заданному отрезку, и вторая часть - нахождение числа различных отрезков, образуемых найденными в первой части точками. Первую часть реализуем методом полного перебора, вторую - методом комбинаторных рассуждений.

program Zadaha08;

var X1,X2,Y1,Y2,K,D:real;Z,X,Y:longint;

^ Function KROT(B:longint):longint;

Var A,S:longint;

begin IF (B<2) then KROT:=0 else begin A:=1; S:=0;

While AB do begin S:=S+B-A;A:=A+1;end;

KROT:=S;

end; end;

Function ZMIN(U,W:REAL):REAL;

begin ZMIN:=U; IF (W
end;

Function ZMAX(U,W:REAL):REAL;

begin ZMAX:=U; IF (W>U) then ZMAX:=W

;end;

begin Z:=0; READLN(X1,Y1,X2,Y2);

^ IF X1X2 THEN BEGIN K:=(Y1-Y2)/(X1-X2); D:=Y2-K*X2;

FOR X:=TRUNC(ZMIN(X1,X2)) TO TRUNC(ZMAX(X1,X2)) DO

IF K*X+D=INT(K*X+D) THEN Z:=Z+1; END

ELSE IF X1=INT(X1) THEN

FOR Y:=TRUNC(ZMIN(Y1,Y2)) TO TRUNC(ZMAX(Y1,Y2)) DO

IF Y/1=INT(Y) THEN Z:=Z+1;

Writeln(KROT(Z));

end.


Задача 9 «Шифр»

Заданы три натуральных числа: два исходных числа и номер члена, который является ключом к шифру. Каждый последующий член последовательности получается путем прибавления к сумме двух предыдущих членов, суммы цифр суммы двух предыдущих членов. Написать программу, которая определяла бы ключ к шифру. Исходные данные - натуральные числа до 1000. Ввод корректен.

Ввод: С1 С2 N - разделенные пробелом исходные числa и номер искомого члена.

Вывод: число-результат.

Пример :

Ввод: Вывод:

39 11 5 140

Задача 9.

Решение задачи требует аккуратной алгоритмизации описанных в условии правил вычисления последующих членов последовательности из предыдущих, реализованных в длинной арифметике.

program Zadaha09;

Type LoNum=string;

^ Var X1,X2,N,i,k:word;

S1,S2,SC,SZ:LoNum;

Function MaxLo(d,e:LoNum):word;

begin

if length(d)>length(e) then MaxLo:=length(d)

else MaxLo:=length(e);

end;

Function PRC(dd:word):LoNum;

Var yy,ll:string;

begin yy:='';

While dd>0 do begin

str(( dd mod 10),ll);

yy:=yy+ll; dd:=dd div 10; end;PRC:=yy;

end;

procedure SUMMY(A,B:LoNum;Var C:LoNum;Var U:word);

var tt,w,v,h,q:word;ss:string;

begin C:='';h:=0;U:=0;

for tt:=1 to MaxLo(A,B) do begin w:=0; v:=0;

if tt<=length(A) then Val(A[tt],w,q);

if tt<=length(B) then Val(B[tt],v,q);

Str(((v+w+h) mod 10),ss);C:=C+ss;

U:=U+((v+w+h) mod 10);

h:=(w+v+h) div 10; end; U:=U+h;

if h0 then begin Str(h,ss);C:=C+ss;end;

end;

BEGIN

readln(X1,X2,N); S1:=PRC(X1); S2:=PRC(X2);

for i:=3 to N do begin SUMMY(S1,S2,SZ,k);

SC:=PRC(k); SUMMY(SC,SZ,SZ,k);

S1:=S2; S2:=SZ;

end;

For i:=Length(SZ) downto 1 do write(SZ[i]:1);

writeln;

end.


Задача 10 «Ход конем»

На клетчатой доске размером N*N клеток в клетке с координатами А, В (координаты отсчитывать от левого нижнего угла), стоит шахматный конь. Конь за один ход перемещается одновременно на две клетки вперед и одну в сторону в любом горизонтальном или вертикальном направлении в пределах заданной доски. Написать программу, которая вычисляла бы количество клеток, в которые конь не сможет попасть за М и менее М ходов. Ввод корректен, М и N: 1
Ввод: N A B М - : размер доски, координаты коня и количество ходов.

Вывод: число - результат.

Пример:

Ввод: Вывод:

5 1 1 3 3

Задача 10.

Для успешного решения задачи требуется так называемый «волновой» метод, или иначе метод фронтального просмотра, который заключается в следующем: очищаем таблицу, соответствующую полю, помечаем начальное положение коня, затем, по количеству заданных шагов повторяем действия: на каждом следующем шаге помечаем клетки в которые конь может попасть за один ход из клеток помеченных на предшествующем шаге. После «разметки» доски, для нахождения ответа необходимо подсчитать на доске клетки оставшиеся не помеченными.

PROGRAM Zadaha10;

^ CONST NM=100;

VAR X,Y,N,M,i,j,k,z:integer;

T:array[-1..NM+2,-1..NM+2] of integer;

Procedure HAG(kk:integer);

Var ii,jj:integer;

Begin

for ii:=1 to N do

for jj:=1 to N do

if T[ii,jj]=kk then begin

T[ii-2,jj-1]:=kk+1;T[ii-2,jj+1]:=kk+1;

T[ii+2,jj-1]:=kk+1;T[ii+2,jj+1]:=kk+1;

T[ii-1,jj-2]:=kk+1;T[ii-1,jj+2]:=kk+1;

T[ii+1,jj-2]:=kk+1;T[ii+1,jj+2]:=kk+1;

end ;

End;

BEGIN readln(N,X,Y,M);

for i:=-1 to N+2 do for j:=-1 to N+2 do T[i,j]:=0;

k:=0; z:=0; T[X,Y]:=1;

While k
for i:=1 to N do for j:=1 to N do if T[i,j]=0 then inc(z);

WRITELN(z);

END.


Задача 11 «Ближайшее число»

Для заданного числа M ( 0<М<2 000 000 000 ), заменой в нем одной любой цифры, найти ближайшее, отличное от М число, которое нацело делилось бы на количество различных знаков, необходимых для записи искомого числа в N-ричной системе счисления (1
Ввод: М N - разделенные пробелами: число и основание системы счисления.

Вывод: число - результат.

Пример:

Ввод: Вывод:

90372 13 90370

Задача 11.

Берем заданное число и, заменяя в нем цифру, получаем новое число, проверяем его на выполнение требований условия задачи: если удовлетворяет - выдаем его в качестве ответа, иначе получаем следующее число. Продолжаем процесс пока не получим ответ или не исчерпаем все варианты замен цифры. Для нахождения ближайшего и наименьшего решения, организуем замену цифры, начиная с младшего разряда. Внутри разряда замену цифры осуществляем поочередно в сторону уменьшения и увеличения сначала на единицу, затем на 2 и т.д. Если все замены исчерпаны, а ответ не найден - переходим в следующий разряд и повторяем процесс замены цифры в нем.

Проверку делимости числа на количество различных знаков, необходимых для его записи в N -ричной системе счисления, ведем так:

1.Заводим массив счетчиков знаков на N элементов и обнуляем его.

2.Пока частное не меньше N - делим его на N, а получающиеся при этом остатки от деления считаем в соответствующих счетчиках. После цикла увеличиваем, счетчик соответствующий знаку частного (меньшего N) .

3. Подсчитываем в массиве число не нулевых счетчиков - это и есть количество различных знаков нужных для его записи в N-ричной системе.

4.Проверяем делимость числа на полученное в п. 3 количество.

PROGRAM Zadaha11;

{$R+}

VAR PR:boolean;

CF,VG,A,B,X:integer;

CH,Sd,f:longint;

Function ZC(G:longint;OS:word):boolean;

Var z,k:word;q:longint;

S:array[0..99] of boolean;

Begin z:=0; ZC:=FALSE; q:=G;

for k:=0 to OS-1 do S[k]:=FALSE;

While q>=OS do begin

S[(q mod OS)]:=TRUE;

q:=q div OS; end; S[q]:=TRUE;

for k:=0 to OS-1 do if S[k] then z:=z+1;

if G mod z = 0 then ZC:=TRUE;

End;

Procedure NACH;

Begin A:=1;B:=1;CF:=(CH div Sd) mod 10;VG:=9-CF;

End;

BEGIN

READLN(CH,X);

Sd:=1;PR:=FALSE; NACH;

WHILE (NOT(PR))AND(CH>=Sd) DO BegiN

IF A<=CF THEN Begin

f:=10*Sd*(CH div (Sd*10))+(CF-A)*Sd+CH mod Sd;

if ZC(f,X) then PR:=TRUE else A:=A+1;

End;

IF (B<=VG)AND(NOT(PR)) THEN Begin

f:=10*Sd*(CH div (Sd*10))+(CF+B)*Sd+CH mod Sd;

if ZC(f,X) then PR:=TRUE else B:=B+1;

End;

IF (A>CF)AND(B>VG) THEN Begin

SD:=Sd*10 ; NACH ; End; EnD;

IF PR THEN WRITELN(f:10) ELSE WRITELN('NO');

END.


Задача 12 «Паралеллопландия»

Страна Параллелопландия имеет форму прямоугольного параллелепипеда размера А на В на С, состоящего из кубиков с единичной длиной ребра. Гражданами этой страны являются все прямоугольные параллелепипеды, расположенные в пределах ее границ и состоящие из целого числа единичных кубиков. Родственниками в этой стране считаются те параллелепипеды, которые имеют хотя бы один общий единичный кубик. Еще в Параллелопландии есть общество кубов, членами которого являются граждане, имеющие все три одинаковых размера. Необходимо написать программу, которая поможет одному маленькому кубику, расположенному по адресу А1, В1, С1 ( число А1 - это номер ряда, в размере А страны, в котором расположен этот единичный кубик, аналогично числа В1 и С1), подсчитать сколько в Параллелопландии граждан не являющихся членами общества кубов не являются родственниками маленького куба. А,В,С,А1,В1,С1 - натуральные числа не превосходящие 50..

Ввод: А В С - разделенные пробелами - размеры страны, в первой строке и –

А1 В1 С1 - три числа, разделенные пробелами - адрес кубика - вo второй строке.

Вывод: число - результат.

Пример:

Ввод: Вывод:

2 1 2 2

1 1 2

Задача 12.

Если подсчитать общее количество различных параллелепипедов (S1), количество различных кубов (S2), различных параллелепипедов, в которые входит адресный кубик (S3), количество различных кубов в которые входит адресный кубик (S4), то результат получается как разность:

(S1-S2)-(S3-S4).

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

Чтобы искомый результат не вышел за пределы типа longint на входных данных близких к максимальным значениям размеров, указанных в ограничениях, члены всех четырех сумм считаются одновременно за один проход и те, которые имеют знак минус, суммируются к результату раньше тех, которые имеют знак плюс.

Корректировочная функция используется для подсчета числа вхождений адресного кубика в куб или параллелепипед заданного размера, она вычисляет величину поправки.

^ PROGRAM Zadaha12;

VAR S,K,a,b,c,N,M,Z,X,Y,U:LONGINT;

FUNCTION KOR(d,e1,w:longint):longint;

VAR e,jj:longint;

begin jj:=0;e:=e1;

if e1>w-e1+1 then e:=w-e1+1;

if d>e then jj:=d-e;

if d>w-e+1 then jj:=jj+d-w+e-1;

KOR:=jj;

end;

BEGIN

readln(M,N,Z);

readln(X,Y,U); S:=0;

if M>N then K:=N else K:=M;

if K>Z then K:=Z;

for a:=1 to M do begin if a<=K then

S:=S-(M-a+1)*(N-a+1)*(Z-a+1)+(a-KOR(a,X,M))*(a-KOR(a,Y,N))*(a-KOR(a,U,Z));

for b:=1 to N do for c:=1 to Z do

S:=S-(a-KOR(a,X,M))*(b-KOR(b,Y,N))*(c-KOR(c,U,Z))+(M-a+1)*(N-b+1)*(Z-c+1);

end;

WRITELN(S:11);

END.


Задача 13 «Число ходов»

На клетчатой доске размером N на N клеток расставлено K белых коней и один черный конь. Один ход коня: на две клетки вперед и на одну в сторону в любом направлении в пределах доски (как в шахматах ). Клетка находится под боем коня, если он может стать в нее за один (следующий) ход. Составить программу, подсчитывающую за какое наименьшее число ходов черный конь, может пройти в клетку с заданными координатами X, Y , не становясь по пути в клетки, находящиеся под боем белых коней, и в клетки, в которых стоят белые кони. Белые кони стоят неподвижно. Если пройти невозможно вывести сообщение: NO. Координаты - натуральные числа, отсчитываются от левого нижнего угла доски: первая координата - номер вертикали, вторая - номер горизонтали, в которой находится клетка. Ввод корректен. Начальное положение черного коня может быть под боем белого коня, если конечная точка под боем - то пройти невозможно.

2 < N < 100, K<=N .

Ввод: из К+1 строки: в 1-й строке: N- размер доски, Х1, У1 -начальные координаты черного коня, Х, У - координаты конечной точки, К - количество белых коней, в каждой из следующих К строк: Хi, Yi- координаты i-го белого коня..

Вывод: число - результат или сообщение - NO.

Пример:

Ввод: Вывод:

1 3 3 1 2 4

2 2

3 2

Задача 13.

Задача решается «волновым» методом: очищаем таблицу (заполняем нулями), соответствующую полю, расставляем белых коней и помечаем отрицательными числами клетки, в которых они находятся или которые они держат под боем, помечаем начальное положение коня, затем, пока в конечной клетке стоит ноль и при прохождении поля есть клетки в которые может сходить, но еще не ходил черный конь, повторяем действия: на каждом следующем шаге помечаем разрешенные для ходов клетки числом, соответствующим номеру шага от начала, в которые конь может попасть за один ход из клеток помеченных на предшествующем шаге. После завершения цикла, если в конечной клетке положительное число, то выдать это число в качестве ответа, иначе выдать ответ "пройти невозможно".

PROGRAM Zadaha13;

^ CONST NM=100;

VAR X,Y,X1,Y1,N,K,M,i,j,z,k1:integer;

T:array[-1..NM+2,-1..NM+2] of integer;

Procedure HAG(kk:integer);

Var ii,jj:integer;

Begin M:=0;

for ii:=1 to N do for jj:=1 to N do

if T[ii,jj]=0 then inc(M);

for ii:=1 to N do

for jj:=1 to N do

if T[ii,jj]=kk then begin

if T[ii-2,jj-1]>=0 then T[ii-2,jj-1]:=kk+1;

if T[ii-2,jj+1]>=0 then T[ii-2,jj+1]:=kk+1;

if T[ii+2,jj-1]>=0 then T[ii+2,jj-1]:=kk+1;

if T[ii+2,jj+1]>=0 then T[ii+2,jj+1]:=kk+1;

if T[ii-1,jj-2]>=0 then T[ii-1,jj-2]:=kk+1;

if T[ii-1,jj+2]>=0 then T[ii-1,jj+2]:=kk+1;

if T[ii+1,jj-2]>=0 then T[ii+1,jj-2]:=kk+1;

if T[ii+1,jj+2]>=0 then T[ii+1,jj+2]:=kk+1;

end ;

for ii:=1 to N do for jj:=1 to N do

if T[ii,jj]=0 then Dec(M);

End;

BEGIN readln(N,X1,Y1,X,Y,K);

for i:=-1 to N+2 do for j:=-1 to N+2 do T[i,j]:=0;

for i:=1 to K do begin Readln(j,z);

T[j,z]:=-2;end; HAG(-2);

if (XX1)or(YY1)or(T[X1,Y1]=0) then T[X1,Y1]:=1;

if T[X,Y]<0 then Writeln('NO') else begin k1:=0; M:=1;

While (T[X,Y]=0)and(M0) do begin inc(k1); HAG(k1); end;

if T[X,Y]=0 then Writeln('NO') else WRITELN(T[X,Y]-1); end;

END.


Задача 14 «Хакер»

Хакеру при помощи подслушивающего устройства удалось подслушать пароль доступа к секретной компьютерной базе данных, который был продиктован по телефону посимвольно ( в звуковой форме наименование букв и цифр, например: буква М произносилась как 'эм', а записывалась хакером в виде одного символа ). Хакер записал пароль в виде строки, состоящей из заглавных букв и цифр. Но радость хакера была преждевременной, так как по телефону ни слова не было сказано большие или маленькие, русские или латинские буквы используются в пароле, а система защиты базы данных различает буквы по этим признакам, кроме этого, записывая буквы, в спешке, хакер записывал услышанные знаки, не учитывая, что некоторые из них в различных алфавитах пишутся одинаково, но звучат по-разному ( например: Р "эр"(рус.) и "пэ" (лат.)). Составить программу, подсчитывающую за какое число попыток ввода пароля, хакеру гарантированно удастся проникнуть в интересующую его базу данных. Ввод корректен. В пароле могут использоваться латинские и русские буквы и цифры, других символов в пароле нет. Длина пароля не превышает 80 символов. Уточнение: одинаково произносиосимыми в различных алфавитах считать буквы:

русские - АБВД ЕЖИКЛМНОПРСТУФЦ

латинские - ABVDE G I KLMNO PRSTU FC

одинаковыми по написанию в различных алфавитах считать буквы:

русские - АВЕКМНОРСТХ

латинские - ABEKMHOPCTX.

Ввод:. строка-пароль, записанная цифрами и заглавными буквами.

Вывод: число - результат.

Пример:

Ввод: Вывод:

AB12 32

Задача 14.

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

^ Program Zadaha14;

const nm=100;

VAR M:array[1..nm] of byte;

i,j,k,q:word; SH,SM,BB,VB:string;

Function Wrhif(X:string):string;

Var ii:byte;S2:string;

Begin S2:='';

for ii:=1 to length(X) do

if Pos(X[ii],BB)0 then S2:=S2+VB[Pos(X[ii],BB)];

Wrhif:=S2;

end;

Procedure UMN(K3:byte);

Var ii,pr,pr1:byte;

begin pr:=0;

for ii:=1 to j do begin pr1:=(K3*M[ii]+pr) div 10;

M[ii]:=(K3*M[ii]+pr) mod 10; pr:=pr1; end;

if pr>0 then begin M[j+1]:=pr; inc(j);end;

end;

Begin

BB:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯABCDEFGHQIJKLMNOPRSTUVWXYZ';

VB:='44824424242444644884444422222222248844446242444448444442422';

^ Readln(SH); SM:=Wrhif(SH);

for i:=1 to nm do M[i]:=0; j:=1; M[j]:=1;

for i:=1 to length(SM) do begin

Val(SM[i],K,q); UMN(K); end;

for i:=j downto 1 do Write(M[i]:1); Writeln;

end.


Задача 15 «Разноделящиеся числа»

Будем называть два целых числа «разноделящимися», если большее по модулю делится без остатка на меньшее по модулю и нет ни одной такой цифры, которая входила бы в десятичную запись обоих этих чисел. Меньшее по модулю из этих чисел будем называть «разноделящимся» делителем большего по модулю числа. Составить программу находящую на заданном интервале число (максимальное) имеющее наибольшее количество различных «разноделящихся» делителей. Вывести это число и количество его различных «разноделящихся» делителей. В отдельно взятом одном из «разноделящихся» чисел цифры могут повторяться; А и В - границы интервала числа, не превосходящие по модулю число 2 000 000; границы входят в интервал, задаются и вводятся в произвольном порядке; длина интервала не превосходит 202; если на заданном интервале несколько чисел имеют равное наибольшее количество различных «разноделящихся» делителей, то взять максимальное из них; число «1» считать делителем (обычным) любого числа; знак числа цифрой не считать;

Ввод: два числа: А и В - границы интервала.

Вывод: два числа: первое - на заданном интервале число, имеющее наибольшее количество различных «разноделящихся» делителей, второе - количество различных «разноделящихся» делителей первого числа.

Пример :

Ввод: Вывод:

9 16 16 6

Задача 15.

Решение задачи требует аккуратной алгоритмизации описанных в условии правил вычисления "разноделящихся" чисел, подсчета количества их делителей, предусмотрев это, как для положительных, так и для отрицательных чисел. Поиск числа на интервале осуществляется методом полного перебора чисел интервала.

^ PROGRAM Zadaha15;

VAR X,Y:real;Hi,Ni,Ki,j,PX,PY:longint;

Function RD(A,B:longint):boolean;

var ii:integer;PP:boolean; KK,DD:longint;

DT,DL:array[0..9] of boolean;

Begin PP:=False;

for ii:=0 to 9 do begin DL[ii]:=False;DT[ii]:=False; end;

if (abs(A)) mod (abs(B)) = 0 then begin

KK:=abs(A);DD:=abs(B); While KK>0 do begin

DL[KK mod 10]:=True;KK:=KK div 10; end;

While DD>0 do begin

DT[DD mod 10]:=True;DD:=DD div 10; end;

for ii:=0 to 9 do PP:=PP or ((DT[ii])and(DL[ii]));

RD:=not(PP); end else RD:=False;

End;

Function KRD(C:longint):longint;

var ss,cc,vg,ng:longint;

Begin cc:=abs(C);ss:=0;vg:=cc-1;ng:=1;

WHILE ((vg>ng)) and (ng<=sqrt(cc)) DO

if RD(cc,ng) then begin inc(ss); vg:=cc div ng ;

if (RD(cc,vg))and(ngvg) then inc(ss);

inc(ng); dec(vg); end else inc(ng);

KRD:=2*ss;

End;

BEGIN readln(X,Y); if X
if (frac(X)=0)or(X<=0) then PX:=0 else PX:=1;

if (frac(Y)=0)or(Y>=0) then PY:=0 else PY:=-1;

Ni:=PX+trunc(X); Ki:=PY+trunc(Y);end

else begin

if (frac(X)=0)or(X>=0) then PX:=0 else PX:=-1;

if (frac(Y)=0)or(Y<=0) then PY:=0 else PY:=1;

Ni:=PY+trunc(Y); Ki:=PX+trunc(X);end;

Hi:=Ni;

for j:=Ni to Ki do if (j0) and (KRD(j)>=KRD(Hi)) then Hi:=j;

^ WRITELN(Hi,' ',KRD(Hi));

END.


Задача 16 «Муравейник»

Вначале сезона из переполненного муравейника уходят М муравьев, которые строят свой новый муравейник, развивающийся по законам:

  • количество родившихся за сезон молодых муравьев равно увеличенному в К раз количеству муравьев в муравейнике, возраст которых на начало сезона не превышал двух сезонов;

  • продолжительность жизни муравья G сезонов;

  • когда численность родившихся за сезон муравьев более чем в В раз превысит их начальное количество, из муравейника уходит 1/В часть муравьев, возраста один сезон (родившихся в прошлом сезоне), чтобы организовывать свои новые муравейники (уход происходит в том же сезоне за который подсчитывается число родившихся).

Составить программу находящую количество муравьев в муравейнике через Т сезонов после его основания. Все события, происходящие в муравейнике, (рождения, смерти, уходы) происходят в течении сезона, но итоги подводятся только по окончании сезона, и весь следующий сезон до его окончания действуют цифры прошлого сезона.Возраст родившегося в текущем сезоне муравья до наступления следующего сезона равен нолю.

Количество уходящих муравьев округляется до целого по правилам арифметики. М,G,К,Т и В - натуральные числа, 1<М <1000, G,К,Т,В не превосходят 255 ; ввод корректен.

Ввод: числа М,K,G,В,T- в перечисленном порядке.

Вывод:. число муравьев в муравейнике после Т сезонов.

Пример :

Ввод: Вывод:

2 3 3 2 5 1005

Задача 16.

Задача требует написания и аккуратной реализации формализованной модели явлений и событий описанных в условии, с сохранением промежуточных значений в таблице, и последовательного вычисления последующих значений из предыдущих, при соблюдении описанных в условии правил.

^ PROGRAM Zadaha16;

VAR K,G,B,T,i,j:byte; M:longint;

R,H:array[0..255] of longint;

BEGIN readln(M,K,G,B,T);R[0]:=M;H[0]:=M;

R[1]:=M*K; if R[1]>M*B then R[0]:=R[0]-round(R[0]/B);

H[1]:=R[0]+R[1];

for i:=2 to T do begin

R[i]:=(R[i-2]+R[i-1])*K;

H[i]:=R[i]+H[i-1];

if R[i]>M*B then begin

H[i]:=H[i]-round(R[i-1]/B);

R[i-1]:=R[i-1]-round(R[i-1]/B);end;

if i>=G then H[i]:=H[i]-R[i-G];

end;

WRITELN(H[T]);

END.


Задача 17 «Составь перевертыш»

Вводится строка до 255 символов. Написать программу составляющую из символов этой строки наибольшей возможной длины «перевертыш» (строка одинаково читаемая справа налево и слева направо), в левой половине которого символы упорядочены по порядку возрастания их ASCII кодов .

Ввод: строка до 255 символов.

Вывод: 1-я строка: длина «перевертыша» 2-я строка: «перевертыш».

Пример :

Ввод: Вывод:

zachem-nuzhen-etot-uchebnik-vvedenie.html
zachem-nuzhna-ekspertiza-pamyatka-dlya-analiza-raboti-uchitelya.html
zachem-nuzhni-bakterii.html
zachem-nuzhno-pravilno-pisat.html
zachem-postroili-egipetskie-piramidi.html
zachem-rossiya-spasaet-i-karimova-radio-29-mayak-novosti-11-10-2005-garin-petr-12-00-29.html
  • lektsiya.bystrickaya.ru/primenyaemie-pribori-rukovodstvo-po-primeneniyu-fotogrammetricheskih-metodov-dlya-sostavleniya-obmernih-chertezhej-inzhenernih-sooruzhenij.html
  • ucheba.bystrickaya.ru/programma-minimum-kandidatskogo-ekzamena-po-specialnosti-09-00-13-religiovedenie-filosofskaya-antropologiya-filosofiya-kulturi-po-filosofskim-i-istoricheskim-naukam.html
  • knowledge.bystrickaya.ru/nauchno-prakticheskaya-konferenciya-pedagogov-programma-razvitiya-municipalnogo-obsheobrazovatelnogo-uchrezhdeniya-srednej.html
  • tasks.bystrickaya.ru/32-trebovaniya-k-oformleniyu-raboti-uchebnoe-posobie-2-e-izdanie-ispravlennoe-i-dopolnennoe.html
  • education.bystrickaya.ru/2-poryadok-vipolneniya-diplomnoj-raboti-metodicheskie-ukazaniya-po-podgotovke-i-zashite-diplomnih-rabot-dlya-studentov.html
  • portfolio.bystrickaya.ru/osnovnaya-shkola-rabochaya-programma-uchitelya-tehnologii-mazurkevich-a-g-na-2008-2009-uchebnij-god-g-serov.html
  • books.bystrickaya.ru/birzha-pfts-utverdila-sostav-indeksnoj-korzini2-osnovnie-harakteristiki-i-osobennosti-razvitiya-fondovih-rinkov-stran-sng.html
  • control.bystrickaya.ru/dohod-na-akciya-i-dividenti-konsolidiran-otchet-za-finansovoto-sstoyanie-1.html
  • thescience.bystrickaya.ru/itogi-iv-shkolnogo-festivalya-lekcij-po-istorii-nauki-literaturi-i-iskusstva-4-marta-v-nashej-shkole-v-chetvertij-raz-proshel-festival-lekcij.html
  • textbook.bystrickaya.ru/gosudarstvenno-chastnoe-partnerstvo26-otchetnij-doklad.html
  • paragraph.bystrickaya.ru/krugovoj-fonar-p-p-bazhov-sobranie-sochinenij-v-treh-tomah-tom-vtoroj.html
  • abstract.bystrickaya.ru/12-drs-ekonomikani-anitamasi-masattari-zhne-mndetter-ekonomikali-zhjelerd-tipter.html
  • urok.bystrickaya.ru/prilozheniya-ministerstvo-obrazovaniya-rossijskoj-federacii-vladimirskij-gosudarstvennij-universitet-vladimirskij.html
  • notebook.bystrickaya.ru/informacionnij-byulleten-12-konkursi-granti-konferencii-maj-2011-g.html
  • letter.bystrickaya.ru/na-vsyakij-pozharnij-gazeta-moskovskij-komsomolec-27042011-rossijskie-smi-o-mchs-monitoring-za-27-aprelya-2011-g.html
  • write.bystrickaya.ru/g-n-matyushin-uchenij-arheolog-otkrivshij-i-issledovavshij-neskolko-naibolee-rannih-stoyanok-cheloveka-na-territorii-rossii-stranica-16.html
  • laboratornaya.bystrickaya.ru/proshloe-i-nastoyashee-v-cikle-ns-leskova-pravedniki-joshkar-olinskaya-i-marijskaya-eparhiya.html
  • literature.bystrickaya.ru/chast-tretya-strategiya-energii-eta-kniga-dlya-cheloveka-kotorij-hochet-napisat-scenarij-postavit-film-i-sigrat.html
  • institut.bystrickaya.ru/stroitelstvo-zhilisha-drevnejshij-period-rodnogo-kraya.html
  • paragraph.bystrickaya.ru/magisterskaya-programma-obshij-i-strategicheskij-menedzhment.html
  • urok.bystrickaya.ru/predislovie-uchebnoe-posobie-gaudeamus-igitur.html
  • zadachi.bystrickaya.ru/model-bolshogo-vzriva-i-rasshiryayushejsya-vselennoj-chast-5.html
  • uchit.bystrickaya.ru/tema-5-investicii-v-osnovnie-proizvodstvennie-fondi-i-drugie-vneoborotnie-aktivi-organizacii.html
  • universitet.bystrickaya.ru/stali-dlya-shtampov-goryachego-deformirovaniya-konspekt-lekcij-po-teme-materialovedenie-dlya-specialnosti.html
  • thescience.bystrickaya.ru/haos-i-poryadok-bushkov-aleksandr-rossiya-kotoroj-ne-bilo-tom-3.html
  • kolledzh.bystrickaya.ru/administraciya-kuedinskogo-rajona-permskogo-kraya-stranica-5.html
  • kontrolnaya.bystrickaya.ru/razdel-11-kachestvo-materialno-tehnicheskoj-bazi-otchet-o-samoobsledovanii-filiala-goudarstvennogo-obrazovatelnogo.html
  • teacher.bystrickaya.ru/glava-ii-uchastie-zhitelej-mezenskogo-municipalnogo-rajona-o-proekte-ustava-municipalnogo-obrazovaniya-mezenskij.html
  • reading.bystrickaya.ru/metodicheskie-rekomendacii-dlya-uchitelej-fizicheskoj-kulturi.html
  • reading.bystrickaya.ru/kurs-tyumenskij-gosudarstvennij-universitet-rabochij-uchebnij-plan-3-kurs-specialnost-buhgalterskij-uchet-analiz-i-audit-5-semestr-6-semestr.html
  • tetrad.bystrickaya.ru/uchebno-tematicheskoe-planirovanie-po-biologii-prikaz-ot-2011g-rabochaya-programma-po-biologii-6-11-klass-po.html
  • abstract.bystrickaya.ru/1764-filmotekar-razmeri-dolzhnostnih-okladov-sluzhashih-i-okladov-po-professiyam-rabochih-specificheskie-dlya.html
  • uchenik.bystrickaya.ru/intellektualnij-centr-fundamentalnaya-biblioteka-mgu-3-stranica-4.html
  • institut.bystrickaya.ru/strategiya-rossijskoj-federacii-v-oblasti-razvitiya-nauki-i-innovacij-na-period-do-2015-g-stroitsya-na-sozdanii-effektivnoj-innovacionnoj-sistemi-i-ispolzovanii-stranica-4.html
  • predmet.bystrickaya.ru/rukovodstvo-provedeniem-organizaciyu-i-provedenie-sorevnovanij-osushestvlyaet-otdel-molodezhnoj-politiki-fizicheskoj-kulturi-i-sporta-administracii-kalininskogo-rajona-sankt-peterburga-nachalnik-otdela-e.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.