Школьная олимпиада 2018 год 9-11 классы
Имя входного файла: | Input.txt |
Имя выходного файла: | Output.txt |
Ограничение времени | 1 секунда на тест |
Ограничение по памяти | 32 Мб |
Задача 1 Поменять местами
Дано натуральное число. Поменять местами первую и последнюю цифры данного натурального числа и возвести полученное число в квадрат.
Входные данные: В единственной строке входного файла INPUT.TXT записано одно натуральное число N (9N9)
Выходные данные: В единственную строку выходного файла OUTPUT.TXT нужно вывести квадрат полученного числа.
Примеры: № | INPUT.TXT | OUTPUT.TXT |
1 | 13 | 961 |
| 123 | 103041 |
{Задача 1. Поменять местами 7-11 кл.}
var N:longint; {исходное число}
x:longint; {дублёр числа N}
i:integer; {количество цифр в числе N}
j:integer; {кратность увеличения последней цифры}
{при перемещении на первое место}
k:longint; {счетчик цикла}
a:integer; {последняя цифра числа N}
b:integer; {первая цифра числа N}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N);
a:=N mod 10; {последняя цифра}
x:=N; {дублирование числа N}
i:=0;
while x0 do
begin
b:=x; {по завершению цикла - первая цифра}
x:=x div 10; {отсекаем последнюю цифру}
i:=i+1; {по завершению цикла - количество цифр в N}
end;
j:=1;
for k:=1 to i-1 do j:=j*10; {j - во сколько раз увеличится цифра a}
if j=1 then writeln(outf,a*a) {или a=b, то есть число N однозначное}
else begin {иначе составляем новое число}
x:=a*j + (N mod j div 10) * 10 + b; {например, 5624=5000+620+4}
writeln(outf,x*x);
end;
close(inf);
close(outf);
end.
Задача 2 Ноль или единица?
Последовательность из единиц и нулей строится по следующему правилу: сначала записывается единица, затем к ней справа приписывается ноль, затем к полученной части справа приписывается полученная часть, но в которой единицы заменены на нули, а нули на единицы и т.д., например: 1 - 10- 1001 - 10010110- 1001011001101001 -» ... .
Определить, какая цифра находится в N-ой позиции последовательности и определить сколько раз придется выполнить операцию приписывания.
Входные данные: В единственной строке входного файла INPUT.TXT записано одно натуральное число N (0N
Выходные данные: В единственную строку выходного файла OUTPUT.TXT нужно вывести найденную цифру и количество операций приписывания.
Пример: № | INPUT.TXT | OUTPUT.TXT |
1 | 13 | 1 4 |
{Задача 2. Ноль или единица? 7-11 кл.}
var N:integer; {искомая позиция}
i:integer; {сколько раз приписывали}
k:integer; {счетчик цикла}
L1:string; {строка после приписывания}
L2:string; {строка до приписывания}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N);
L1:='1'; {начальная строка}
i:=0; {подготовка к счету количества приписываний}
while Nlength(L1) do {цикл приписываний}
begin
L2:=L1; {дулирование строки L1}
for k:=1 to length(L2) do {проверка каждого символа строки L1}
begin
if L2[k]='1' then L1:=L1+'0' {приписывание}
else L1:=L1+'1';
end;
i:=i+1; {количество приписываний}
end;
writeln(outf,L1[N],' ',i); {вывод результата}
close(inf);
close(outf);
end.
Задача 3 Преобразованная разность
Пусть A – массив, состоящий из N элементов A1,...,AN. Обозначим его максимальное и минимальное значение как max(A) и min(A) соответственно. Вычислим сумму элементов S, S=A1+A2+...+AN. Заменим каждый элемент массива на разность S и этого элемента: Ai:=S–Ai, 1Transform. Напишите программу, которая по массиву A вычислит разность max(B)-min(B), где В – массив, полученный в результате K-кратного применения операции Transform к массиву А.
Технические требования:
1. Первая строка входного файла INPUT.TXT содержит целые числа N и K, где N – количество элементов массива А (2Transform к начальному массиву A (1
2. Вторая строка файла содержит N элементов массива А. Элементы массива А – целые числа, принадлежащие диапазону от -32 000 до 32 000.
3. Единственная строка выходного файла OUTPUT.TXT должна содержать целое число, равное разности max(B) и min(B).
Пример.
№ | INPUT.TXT | OUTPUT.TXT |
1 | 10 5 45 52 47 46 44 48 49 43 50 51 | 9 |
{Задача 3. Преобразованная разность 9-11 кл.}
var N:integer; {размерность массива}
A:array[1..10000] of longint; {исходный массив}
i,j:longint; {счетчики циклов}
K:integer; {количество операций трансформации}
S:longint; {сумма элементов}
max,min:longint; {max, min элементы}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N,K);
for i:=1 to N do read(inf,A[i]); {ввод исходного массива}
for j:=1 to K do {выполнение K раз трансформации массива}
begin
S:=0;
for i:=1 to N do S:=S+A[i]; {вычисление суммы элементов массива A}
for i:=1 to N do A[i]:=S-A[i]; {замена элементов на разность}
end;
min:=A[1]; {поиск max и min}
max:=A[1];
for i:=2 to N do
begin
if minA[i] then min:=A[i];
if max
end;
writeln(outf,max-min);
close(inf);
close(outf);
end.
Задача 4 Канал связи
По некоторому каналу связи передается сообщение, состоящее из 0 и 1. Из-за помех возможны ошибки при передаче сигнала. Поэтому было решено передавать каждый сигнал трижды, теперь вместо 1 передается 111, а вместо 0 - 000. При передаче данных все равно случаются помехи, поэтому при расшифровке сообщения берут тот символ, который встречается в группе из 3-х символов чаще.
Дан файл, в котором расположены символы из 0 и 1. Их количество N кратно 3. Расшифровать текст и записать его в другой файл.
Входные данные: В единственной строке входного файла INPUT.TXT записана последовательность из N (2N
Выходные данные: В единственную строку выходного файла OUTPUT.TXT нужно вывести расшифрованный текст.
Примеры:
№ | INPUT.TXT | OUTPUT.TXT |
1 | 111000 | 10 |
2 | 101001 | 10 |
{Задача 4. Канал связи 9-11 кл.}
var N:integer; {длина последовательности}
i:integer; {счетчик цикла}
k:integer; {количество единиц в тройке}
a:char; {для ввода очередного символа из последовательности}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
while not(eof(inf)) do {пока не конец файла}
begin
k:=0;
for i:=1 to 3 do {ввод тройки символов}
begin
read(inf,a);
if a='1' then k:=k+1; {счет количества единиц}
end;
if k1 then write(outf,'1') {вывод одного символа из тройки}
else write(outf,'0')
end;
close(inf);
close(outf);
end.
Задача 5 Похожие числа
Назовем два числа похожими, если они состоят из одних и тех же цифр.
Например, числа 1132 и 32321 похожие, а 12 и 123 нет (в первом числе нет цифры 3). Требуется написать программу, которая определит, являются ли два данных натуральных числа похожими.
Входные данные:
Входной файл Input.txt содержит в первой строке натуральное число K – количество тестов, не превышающее 10. В следующих K строках содержится по два целых числа A и B, разделенных пробелами. (0A,B9)
Выходные данные:
Выходной файл Output.txt должен содержать K строк. Для каждого теста в отдельной строке надо выдать сообщение «YES», если A и B являются похожими, или «NO», если нет.
Примеры:
№ | INPUT.TXT | OUTPUT.TXT |
1 | 1 1132 32321 | YES |
2 | 2 12 123 11 111 | NO YES |
{Задача 5. Похожие числа 9-11 кл.}
var K:integer; {количество тестов}
A,B:longint; {исходные числа}
BA:set of byte; {множество цифр числа A}
BB:set of byte; {множество цифр числа B}
x:byte; {отдельная цифра числа}
i:integer; {счетчик цикла}
inf,outf:text; {для файлов}
begin
assign(inf,'input.txt'); {открытие файлов}
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,K);
for i:=1 to K do
begin
read(inf,A,B); {ввод чисел A и B}
BA:=[]; {пустое множество цифр числа A}
BB:=[]; {пустое множество цифр числа B}
while A0 do
begin
x:=A mod 10; {выделение последней цифры числа A}
BA:=BA + [x]; {добавление последней цифры во множество BA}
A:=A div 10;
end;
while B0 do
begin
x:=B mod 10; {выделение последней цифры числа B}
BB:=BB + [x]; {добавление последней цифры во множество BB}
B:=B div 10;
end;
if BA=BB then writeln(outf,'YES') {сравнение двух множеств}
else writeln(outf,'NO')
end;
close(inf); {закрытие файлов}
close(outf);
end.
Задача 6 Исправления
Дана строка, содержащая не более 100 символов. Среди символов строки особую роль играет символ #, появление которого в ней означает удаление предыдущего символа, и символ $, появление которого в ней означает удвоение предыдущего символа. Соответственно, k символов #, идущих подряд, удаляют k предыдущих символов строки, если таковые имеются. Если в какой-то момент перед некоторым символом # или $ не осталось символов, то этот символ следует игнорировать. Символы # и $ не оказывают влияния друг на друга. Преобразовать исходную строку с учетом указанных значений символов # и $, при этом сами эти символы не выводятся.
Входные данные:
Входной файл Input.txt содержит единственную строку.
Выходные данные:
Выходной файл Output.txt должен содержать преобразованную строку
Примеры: | |
| № | INPUT.TXT | OUTPUT.TXT |
| 1 | Prrrr###ivee#t! | Privet! |
| 2 | ko###ve$$#r | veer |
{Задача 6. Исправления}
var L:string; {исходная строка}
k1:integer; {текущий левый индекс символа в строке L}
k2:integer; {текущий правый индекс символа в строке L}
i,j:integer; {счетчики циклов}
inf,outf:text; {для ввода-вывода из файлов}
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,L);
k1:=1; {текущий левый индекс символа в строке L}
k2:=length(L); {текущий правый индекс символа в строке L}
while k1
begin
case L[k1] of
'#': {обработка знака #}
if k1-10 then
begin {перед # есть символ для удаления}
for j:=k1-1 to k2-2 do {сдвиг строки на две позиции}
L[j]:=L[j+2]; {удаляем символ и #}
k2:=k2-2;
k1:=k1-2;
end
else
begin {перед # нет символа для удаления}
for j:=k1 to k2-1 do {сдвиг строки на одну позицию}
L[j]:=L[j+1]; {чтобы убрать #}
k2:=k2-1;
k1:=k1-1;
end;
'$': {обработка знака $}
if k1-10 then L[k1]:=L[k1-1] {перед $ есть символ для дублирования}
{$ заменяем на символ}
else
begin {перед $ нет символ для дублирования}
for j:=k1 to k2-1 do {сдвиг строки на одну позицию}
L[j]:=L[j+1]; {чтобы убрать $}
k2:=k2-1;
k1:=k1-1;
end;
end;
k1:=k1+1; {переход к следующему справа символу}
end;
for i:=1 to k2 do write(outf,L[i]); {вывод преобразованной строки}
close(inf);
close(outf);
end.
Задача 7 К-удивительные числа
Переворотом числа X назовем число, в котором все цифры числа X стоят в обратном порядке. Например, переворотом числа 6372 является число 2736, а числа 7800 — 87. Назовем K-удивительным такое число, которое в сумме со своим переворотом дает число K.
Например, у числа 222 имеется всего два K-удивительных числа: 111 и 210, а у числа 1050 имеется девять K-удивительных числа: 129, 228, 327, 426, 525, 624, 723, 822, 921.
Требуется написать программу, которая по заданному K определит количество K-удивительных чисел.
Входные данные:
Входной файл INPUT.TXT содержит одно натуральное число K (1 ≤ K ≤ 106).
Выходные данные:
Выходной файл OUTPUT.TXT должен содержать все K-удивительные числа и их количество Примеры:
№ | INPUT.TXT | OUTPUT.TXT |
1 | 222 | 111 210 2 |
2 | 1050 | 129 228 327 426 525 624 723 822 921 9 |
{Задача 7. К-удивительные числа}
var N:integer; {N - Исходное число}
x:integer; {K-удивительное чисел}
y:longint; {переворот числа x. x+y=N должно быть по условию задачи}
i:longint; {параметр цикла, x=i}
k:longint; {количество K-удивительных чисел}
inf,outf:text; {внутренние логические имена входного и выходного файлов}
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N);
k:=0;
for i:=1 to N do
begin
x:=i; {x-число, y-его переворот}
y:=0;
while x0 do {построение числа y}
begin
y:=y*10+(x mod 10);
x:=x div 10;
end;
if y+i=N then {счет количества K-удивительных чисел}
begin
inc(k);
write(outf,i,' ');
end;
end;
write(outf,k);
close(inf);
close(outf);
end.
Задача 8 Шифр Для открытия замка сейфа в компьютерной игре из серии "Побег из комнаты" нужно найти шифр. Имеется подсказка – линейка с нанесенными на ней числами, по которой движется ползунок с прорезями, через которые видны числа на линейке. Края ползунка не могут выйти за границы линейки из-за ограничителей на концах линейки. Рядом с прорезями на ползунке нарисованы знаки + и есть текст "max". Нетрудно догадаться, что шифром для сейфа является набор чисел на линейке, видимых через прорези ползунка, сумма которых максимальна.
Напишите программу, которая определит максимальную сумму чисел, входящих в какой -нибудь шифр для открытия сейфа.
Входные данные:
Первая строка входного файла Input.txt содержит одно целое число N (2 ≤ N ≤ 10) – размеры ползунка. Вторая строка содержит N целых чисел от 0 до 1, разделенных пробелами – описание формы ползунка слева направо. Число 0 означает, что эта часть ползунка не имеет прорезей, а число 1 соответствует части ползунка с прорезью. В описании ползунка есть по крайней мере одно число 1. Третья строка ввода содержит одно целое число M (N M ≤ 1000) – количество чисел на линейке. Четвертая строка ввода содержит M целых чисел от 0 до 99, разделенных пробелами – числа на линейке, перечисленные в порядке их размещения на линейке.
Выходные данные:
В выходной файл Output.txt вывести максимальную сумму чисел, входящих в какой -нибудь шифр.
Пример: | |
| № | INPUT.TXT | OUTPUT.TXT |
| 1 | 5 1 0 0 1 0 10 7 11 4 3 5 15 2 1 0 25 | 19 |
{Задача 8. Шифр}
var N:integer; {длина ползунка}
M:integer; {длина линейки - количество чисел на линейке}
A:array[1..10] of byte; {описание формы ползунка}
B:array[1..1000] of shortint; {числа на линейке}
s:integer; {сумма чисел на ползунке}
smax:integer; {максимальная сумма чисел на ползунке}
i,j:integer; {счетчики циклов}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N); {ввод длины ползунка}
for i:=1 to N do {ввод описания формы ползунка}
read(inf,A[i]);
read(inf,M); {ввод количества чисел на линейке}
for i:=1 to M do {чтение в массив чисел на линейке}
read(inf,B[i]);
smax:=0;
for i:=1 to M-N do {движение ползунка по линейке}
begin
s:=0;
for j:=1 to N do {вычисление суммы на ползунке}
if A[j]=1 then s:=s+B[i+j];
if ssmax then smax:=s; {поиск максимальной суммы чисел на ползунке}
end;
write(outf,smax); {вывод результата}
close(inf);
close(outf);
end.
Задача 9 Найти Х
Последовательность натуральных чисел характеризуется числом Х – наибольшим числом, кратным 14 и являющимся произведением двух элементов последовательности с различными номерами. Напишите программу, находящую число X для последовательности натуральных чисел, значение каждого элемента которой не превосходит 1000. Программа должна напечатать найденное число, если оно существует для заданной последовательности, или ноль в противном случае.
На вход программе в первой строке подаётся количество чисел N (1N).
В каждой из последующих N строк записано одно натуральное число, не превышающее 1000.
Пример:
| |
| № | INPUT.TXT | OUTPUT.TXT |
| 1 | 5 40 1000 7 28 55 | 28000 |
{Задача 9. Найти Х. Лобовое решение методом перебора}
var N: integer; {количество чисел}
a: array[1..1000] of integer; {массив исходных чисел}
max: integer; {наибольшее произведение двух элементов}
i,j: integer; {счётчики циклов}
p:longint; {произведение двух элементов}
{можно не хранить произведение longint, а запоминать}
{x, y: integer; {выбранная пара, дающая максимальное произведение}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N);
for i:=1 to N do readln(inf,a[i]); {чтение последовательности в массив}
max:=0; {если произведение не найдётся, выводим 0}
for i:=1 to N-1 do {поиск произведения}
for j:=i+1 to N do
begin
p:=a[i]*a[j];
if (p mod 14 =0) and (pmax) then max:=p;
end;
writeln(outf,max);
close(inf);
close(outf);
end.
{Задача 9. Найти Х. Эффективное по памяти и времени решение}
var N: integer; {количество чисел}
a: integer; {очередное число}
m1: integer; {количество нечётных, не кратных 7}
m2: integer; {количество чётных, не кратных 7}
m7: integer; {количество нечётных, кратных 7}
m14: integer; {количество чётных, кратных 14}
x, y: integer; {выбранная пара чисел, дающая максимальное произведение}
i: integer;
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N);
m1:=0; m2:=0; m7:=0; m14:=0;
x:=0; y:=0;
for i:=1 to N do begin
readln(inf,a);
if (a mod 14 = 0) and (a m14) then m14:= a
else if (a mod 7 = 0) and (a m7) then m7:= a
else if (a mod 2 = 0) and (a m2) then m2:= a
else if a m1 then m1:= a;
end;
x:=m1; y:=m14;
if m2*m7 x*y then begin
x:=m2; y:=m7;
end;
if m7*m14 x*y then begin
x:=m7; y:=m14;
end;
if m2*m14 x*y then begin
x:=m2; y:=m14;
end;
if x*y = 0 then writeln(outf,0)
else writeln(outf,x*y);
close(inf);
close(outf);
end.
{Задача 9. Найти Х. Эффективное по памяти и времени решение}
{По мотивам задания 27 ЕГЭ}
var N: integer; {количество чисел}
a: integer; {очередное число}
m1: integer; {количество нечётных, не кратных 7}
m2: integer; {количество чётных, не кратных 7}
m7: integer; {количество нечётных, кратных 7}
m14: integer; {количество чётных, кратных 14}
x, y: integer; {выбранная пара чисел, дающая максимальное произведение}
i: integer;
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N);
m1:=0; m2:=0; m7:=0; m14:=0;
x:=0; y:=0;
for i:=1 to N do begin
readln(inf,a);
if a mod 2 = 0 then begin
if a mod 7 = 0 then begin
if am14 then m14 := a
end
else begin
if am2 then m2 := a
end
end
else begin
if a mod 7 = 0 then begin
if am7 then m7 := a
else begin
if am1 then m1 := a
end
end
end
end;
x:=m1; y:=m14;
if m2*m7 x*y then begin
x:=m2; y:=m7;
end;
if m7*m14 x*y then begin
x:=m7; y:=m14;
end;
if m2*m14 x*y then begin
x:=m2; y:=m14;
end;
if x*y = 0 then writeln(outf,0)
else writeln(outf,x*y);
close(inf);
close(outf);
end.
Задача 10 Матрица
Дана квадратная матрица размерности N. Элементам, расположенным по периметру матрицы присвоить значение 1. Элементам, расположенным по периметру оставшейся подматрицы – значение 2 и так далее до заполнения всей матрицы.
Входные данные:
В единственной строке файла Input.txt дано натуральное число N (1N
Выходные данные:
Вывести полученную матрицу, разделяя числа в строках матрицы одним пробелом.
Пример:
Пример: | |
| № | INPUT.TXT | OUTPUT.TXT |
| 1 | 3 | 1 1 1 1 2 1 1 1 1 |
| 2 | 5 | 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1 |
{Задача 10. Матрица 9-11 кл.}
var N:integer; {размерность массива}
NN:integer; {дублёр числа N}
a:array[1..99,1..99] of integer; {квадратная матрица}
i,j:integer;
p:integer; {число периметров вокруг матрицы или оборотов}
k:integer; {число, записываемое на периметре}
l:longint; {номер строки матрицы, на которую пишем}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N); {чтение размерности матрицы}
NN:=N; {дублирование N}
k:=1; {число на периметре}
p:=N div 2 + N mod 2; {число оборотов}
l:=1; {номер строки матрицы}
while p0 do {p раз делаем обороты по периметру матрицы}
begin {начинаем с левого верхнего угла матрицы}
for i:=l to N do a[l,i]:=k; {слева направо}
for i:=l+1 to N do a[i,N]:=k; {сверху вниз}
for i:=N-1 downto l do a[N,i]:=k; {справа налево}
for i:=N-1 downto l+1 do a[i,l]:=k; {снизу вверх}
dec(N); {уменьшаем правую границу матрицы}
inc(l); {увеличиваем номер строки матрицы}
dec(p); {уменьшаем число оборотов}
inc(k); {увеличиваем число, записываемое на периметре}
end;
for i:=1 to NN do {вывод матрицы}
begin
for j:=1 to NN do
write(outf,a[i,j]:2,' ');
writeln;
end;
close(inf);
close(outf);
end.