СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

2018 9-11 класс Практика решения задач школьного этапа ВсОШ по информатике на языке программирования Pascal

Категория: Информатика

Нажмите, чтобы узнать подробности

Решение задач школьного этапа ВсОШ по информатике 2018-19 учебного года на языке программирования Pascal.

Просмотр содержимого документа
«2018 9-11 класс Практика решения задач школьного этапа ВсОШ по информатике на языке программирования Pascal»

Школьная олимпиада 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 символов. Среди символов строки особую роль играет символ #, появление которого в ней означает удаление предыдущего символа, и символ $, появление которого в ней означает удвоение предыдущего символа. Соответственно, символов #, идущих подряд, удаляют предыдущих символов строки, если таковые имеются. Если в какой-то момент перед некоторым символом # или $ не осталось символов, то этот символ следует игнорировать. Символы # и $ не оказывают влияния друг на друга. Преобразовать исходную строку с учетом указанных значений символов # и $, при этом сами эти символы не выводятся.

Входные данные:

Входной файл 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 (NM ≤ 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.


Скачать

Рекомендуем курсы ПК и ППК для учителей

Вебинар для учителей

Свидетельство об участии БЕСПЛАТНО!