Пример 1. (ЕГЭ-2014). По каналу связи передаётся
последовательность положительных целых чисел, все числа не превышают 1000.
Количество чисел известно, но может быть очень велико. Затем передаётся
контрольное значение последовательности – наибольшее число R,
удовлетворяющее следующим условиям:
R –
произведение двух различных переданных элементов последовательности
(«различные» означает, что не рассматриваются квадраты переданных чисел;
допускаются произведения различных элементов последовательности, равных по
величине);
R делится на
21.
Если такого числа R
нет, то контрольное значение полагается равным 0.
В результате помех при
передаче как сами числа, так и контрольное значение могут быть искажены.
Напишите эффективную, в
том числе по используемой памяти, программу (укажите используемую версию
языка программирования, например, Borland Pascal 7.0), которая будет
проверять правильность контрольного значения.
Программа должна
напечатать отчёт по следующей форме:
Вычисленное
контрольное значение: …
Контроль пройден (или
– Контроль не пройден)
Перед текстом программы
кратко опишите используемый Вами алгоритм решения.
На вход программе в
первой строке подаётся количество чисел N. В каждой из последующих
N строк записано одно натуральное число, не превышающее 1000. В
последней строке записано контрольное значение.
Пример входных данных: 6
70
21
997
7
9
300
21000 Пример выходных данных
для приведённого выше примера входных данных: Вычисленное контрольное
значение: 21000
Контроль пройден
Пример готовой программы
var M7,M3,M21,R,MAX,dat,res,i,N: longint;
begin
M7 := 0;
M3 := 0;
M21 := 0;
MAX := 0;
readln(N);
for i := 1 to N do
begin
readln(dat);
if ((dat mod 7) = 0) and ((dat mod 3) > 0)
and (dat > M7) then M7 := dat;
if ((dat mod 3) = 0) and ((dat mod 7) > 0)
and (dat > M3) then M3 := dat;
if (dat mod 21 = 0) and (dat > M21)
then begin
if M21 > MAX then MAX := M21;
M21 := dat
end
else if dat > MAX then MAX := dat;
end;
readln(R);
if (M7*M3 < M21*MAX)
then res := M21*MAX
else res := M7*M3;
writeln('Вычисленное контрольное значение: ',res);
if R = res then writeln('Контроль пройден')
else writeln('Контроль не пройден');
end.
Пример 2. По каналу связи передаются данные в виде
последовательности положительных целых чисел. Количество чисел заранее
неизвестно, но не менее двух, признаком конца данных считается число 0.
После данных передаётся контрольное значение. Оно равно такому максимально
возможному произведению двух чисел из переданного набора, которое делится на
7, но не делится на 49. Если такое произведение получить нельзя, контрольное
значение считается равным 1.
Напишите
эффективную, в том числе по памяти, программу, которая будет моделировать
процесс приёма данных. Программа должна ввести все числа и контрольное значение
и напечатать краткий отчёт, включающий количество принятых чисел, принятое
контрольное значение, вычисленное контрольное значение и вывод о совпадении
значений.
Перед текстом программы кратко опишите алгоритм решения задачи и укажите
используемый язык программирования и его версию.
Описание входных данных
В
каждой строке исходных данных содержится одно целое число. Сначала идут
строки с основными данными – положительными числами, затем число 0 (признак
окончания данных), в последней строке – контрольное значение.
Описание выходных данных
Программа должна вывести отчёт по форме, приведённой ниже в примере.
Пример входных данных:
Пример выходных данных:
6
Введено чисел: 4
7
Контрольное значение: 64
8
Вычисленное значение: 63
9
Значения не совпали
0
64
Пример готовой программы
var x, max7, max, R, R1, count: integer;
begin
max:= 0; max7:= 0;
count:= 0;
while True do begin
read(x);
if x = 0 then break;
Inc(count);
if (x mod 7 = 0) and (x mod 49 <> 0) and
(x > max7) then max7:= x;
if (x mod 7 <> 0) and (x > max) then max:= x;
end;
read(R);
R1:= max7*max;
if R1 = 0 then R1:= 1;
writeln('Введено чисел: ', count);
writeln('Контрольное значение: ', R );
writeln('Вычисленное значение: ', R1);
if R1 = R then
writeln('Значения совпали')
else writeln('Значения не совпали')
end.
Пример 3.(ЕГЭ-2013). На вход программе
подаются сведения о пассажирах, желающих сдать свой багаж в камеру хранения
на заранее известное время до полуночи. В первой строке сообщается число
пассажиров N, которое не меньше 3, но не превосходит 1000; во второй строке
– количество ячеек в камере хранения K, которое не меньше 10, но не
превосходит 1000. Каждая из следующих N строк имеет следующий формат:
<Фамилия> <время сдачи багажа> <время освобождения
ячейки>,
где <Фамилия> – строка, состоящая не более чем из
20 непробельных
символов;
<время сдачи багажа>
– через двоеточие два целых числа,
соответствующие часам (от 00 до 23 – ровно 2
символа) и минутам (от 00 до 59 – ровно 2
символа);
<время освобождения ячейки> имеет тот же формат.
<Фамилия> и <время сдачи багажа>, а также
<время сдачи багажа> и <время освобождения ячейки> разделены одним пробелом.
Время освобождения больше времени сдачи.
Сведения отсортированы в порядке времени сдачи багажа. Каждому из пассажиров
в камере хранения выделяется свободная ячейка с минимальным номером. Если в
момент сдачи багажа свободных ячеек нет, то пассажир уходит, не дожидаясь
освобождения одной из них.
Требуется написать программу (укажите используемую версию
языка программирования, например Borland Pascal 7.0), которая будет выводить
на экран для каждого пассажира номер ему предоставленной ячейки (можно сразу
после ввода данных очередного пассажира). Если ячейка пассажиру не
предоставлена, то его фамилия не печатается.
Пример входных данных:
Результат работы программы на этих входных данных:
3
Иванов 1
10
Петров 2
Иванов 09:45 12:00
Сидоров 1
Петров 10:00 11:00
Сидоров 12:00 13:12
Пример готовой программы
var p:array[1..1000] of integer;
c,c1:char;
i,j,N,K:integer;
name:string;
time1,time2:integer;
begin
readln(N,K);
for i:=1 to K do
p[i]:=0;
for i:=1 to N do
begin
name:='';
repeat
read(c);
name:=name+c
until c=' '; {считана фамилия}
read(c,c1); {считаны часы первого времени}
time1:=60*((ord(c)-ord('0'))*10+ ord(c1)-ord('0'));
read(c,c,c1); {пропущено двоеточие, и считаны минуты}
time1:=time1+(ord(c)-ord('0'))*10+ord(c1)-ord('0');
read(с,c,c1); {считаны часы второго времени}
time2:=60*((ord(c)-ord('0'))*10+ ord(c1)-ord('0'));
readln(c,c,c1); {пропущено двоеточие, и считаны минуты}
time2:=time2+(ord(c)-ord('0'))*10+ord(c1)-ord('0');
for j:=1 to K do
if p[j]<=time1 then
begin
p[j]:=time2;
writeln(name,' ',j);
break;
end;
end;
end.
Пример 4.По
каналу связи передаётся последовательность положительных целых чисел. Все
числа не превышают 1000, их количество известно, но может быть очень велико.
Затем передаётся контрольное значение – наибольшее число R, удовлетворяющее
следующим условиям:
R –
произведение двух различных переданных элементов последовательности
(«различные» означает, что не рассматриваются квадраты переданных чисел;
допускаются произведения различных элементов последовательности, равных по
величине);
R не делится на
10.
В результате помех при
передаче как сами числа, так и контрольное значение могут быть искажены.
Напишите эффективную, в
том числе по используемой памяти, программу, которая будет
проверять правильность контрольного значения. Программа должна
напечатать отчёт по следующей форме:
Получено чисел: …
Принятое контрольное значение: …
Вычисленное контрольное
значение: …
Контроль пройден (или
Контроль не пройден)
Если удовлетворяющее условию контрольное значение определить невозможно,
вычисленное контрольное значение не выводится, но выводится фраза «Контроль
не пройден».
Перед текстом программы кратко опишите алгоритм решения и укажите язык
программирования и его версию.
Входные данные
В первой строке указывается количество чисел N. В каждой из последующих N
строк записано одно натуральное число, не превышающее 1000.
В последней строке записано контрольное значение.
Пример входных данных:
5
60
7
8
15
20
105
Выходные данные
Программа должна напечатать отчёт по образцу, приведённому в условии.
Пример выходных данных для приведённого выше примера входных данных:
Получено чисел: 5
Принятое контрольное значение: 105
Вычисленное контрольное значение: 105
Контроль пройден
Пример готовой программы
program c4;
var
N: integer; {количество чисел на входе}
x: integer; {исходные данные}
a2, b2: integer; {макс. числа, кратные 2, но не кратные 5}
a5, b5: integer; {макс. числа, кратные 5, но не кратные 2}
a0, b0: integer; {максимальные числа, не кратные 5 и 2}
R: integer; {введенное контрольное значение}
m: integer; {вычисленное контрольное значение}
i: integer;
begin
readln(N);
a2:=0; b2:=0;
a5:=0; b5:=0;
a0:=0; b0:=0;
for i:=1 to N do begin
readln(x);
if x mod 10 = 0 then {ничего не делать}
else if x mod 2 = 0 then begin
if x>a2 then begin b2:=a2; a2:=x end
else if x>b2 then b2:=x
end
else if x mod 5 = 0 then begin
if x>a5 then begin b5:=a5; a5:=x end
else if x>b5 then b5:=x
end
else begin
if x>a0 then begin b0:=a0; a0:=x end
else if x>b0 then b0:=x
end
end;
readln(R);
m := a0*a2;
if a0*a5>m then m:=a0*a5;
if a0*b0>m then m:=a0*b0;
if a2*b2>m then m:=a2*b2;
if a5*b5>m then m:=a5*b5;
writeln('Получено чисел: ', N);
writeln('Принятое контрольное значение: ', R);
if m>0 then writeln('Вычисленное контрольное значение: ', m);
if (R>0) and (R=m)
then writeln('Контроль пройден')
else writeln('Контроль не пройден')
end.
Пример 5.
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов
некоторой средней школы. В первой строке сообщается количество учеников N,
которое не меньше 10, но не превосходит 100, каждая из следующих N строк
имеет следующий формат:
<Фамилия> <Имя> <оценки>,
где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> –
строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых
числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а
также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную
программу (укажите используемую версию языка
программирования, например, Borland Pascal 7.0),
которая будет выводить на экран фамилии и имена
трех худших по среднему баллу учеников. Если
среди остальных есть ученики, набравшие тот же
средний балл, что и один из трех худших, то
следует вывести и их фамилии и имена.
Пример готовой программы
const LIM = 100;
var Info: array[1..LIM] of record
name: string;
sum: integer;
end;
i, k, N, mark, min1, min2, min3: integer;
c: char;
begin
readln(N);
{ ввод исходных данных }
for i:=1 to N do begin
Info[i].name := '';
for k:=1 to 2 do
repeat
read(c);
Info[i].name := Info[i].name + c;
until c = ' ';
Info[i].sum := 0;
for k:=1 to 3 do begin
read(mark);
Info[i].sum := Info[i].sum + mark;
end;
readln;
end;
{ поиск трех минимальных }
min1 := 20; min2 := 20; min3 := 20;
for i:=1 to N do begin
if Info[i].sum < min1 then begin
min3 := min2; min2 := min1;
min1 := Info[i].sum;
end
else if Info[i].sum < min2 then begin
min3 := min2;
min2 := Info[i].sum;
end
else if Info[i].sum < min3 then
min3 := Info[i].sum;
end;
{ вывод результата }
for i:=1 to N do
if Info[i].sum <= min3 then
writeln(Info[i].name);
end.
Пример 6. Дед Мороз и Снегурочка приходят на
детские утренники с мешком конфет. Дед Мороз делит конфеты поровну между
всеми присутствующими детьми (детей на утреннике никогда не бывает больше
100), а оставшиеся конфеты отдает Снегурочке. Снегурочка каждый раз
записывает в блокнот количество полученных конфет. Если конфеты разделились
между всеми детьми без остатка, Снегурочка ничего не получает и ничего не
записывает. Когда утренники закончились, Деду Морозу стало интересно, какое
число чаще всего записывала Снегурочка. Дед Мороз и Снегурочка – волшебные,
поэтому число утренников N, на которых они побывали, может быть очень
большим.
Напишите программу, которая будет решать эту задачу. Перед
текстом программы кратко опишите алгоритм решения задачи и укажите
используемый язык программирования и его версию.
Желательно, чтобы программа была эффективной как по
времени работы, так и по используемой памяти. Программу будем считать
эффективной по памяти, если используемая память не зависит от размера
входных данных (то есть числа утренников).
Программу будем считать
эффективной по времени, если при увеличении
размера входных данных N в t раз (t – любое
число) время её работы увеличивается не
более чем в t раз.
Описание входных данных
В первой строке вводится одно целое положительное число –
количество утренников N.
Каждая из следующих N строк содержит два целых числа: сначала D – количество
пришедших на очередной утренник детей, а затем K – количество конфет в мешке
Деда Мороза на этом утреннике. Гарантируется выполнение следующих
соотношений:
1 ≤ N ≤ 10000
1 ≤ D ≤ 100 (для каждого D)
D ≤ K ≤ 1000 (для каждой пары D, K)
Описание выходных данных
Программа должна вывести одно число – то, которое
Снегурочка записывала чаще всего. Если несколько чисел записывались
одинаково часто, надо вывести большее из них. Если Снегурочка ни разу ничего
не записывала, надо вывести ноль.
Пример входных данных:
Пример выходных данных:
7
31
10 58
15 315
20 408
100 1000
32 63
32 63
11 121
Пример готовой программы
program c4;
const DMAX=100; {максимально возможное количество детей}
var
N: integer; {количество утренников}
D: integer; {количество детей на утреннике}
K: integer; {количество конфет}
r: integer; {остаток}
c: array[1..DMAX-1] of integer; {счетчики остатков}
i: integer;
imax: integer;
begin
{предварительная очистка счетчиков}
for i:=1 to DMAX-1 do c[i]:=0;
readln(N);
{ввод данных, подсчет количества каждого остатка}
for i:=1 to N do begin
readln(D, K);
r := K mod D;
if r>0 then c[r]:=c[r]+1;
end;
{выбор самого частого остатка}
imax:=1;
for i:=2 to DMAX-1 do begin
if c[i]>=c[imax] then imax:=i;
end;
if c[imax]=0 then imax:=0;
writeln(imax);
end.
Учащиеся гимназии могут задать вопросы по решению задач.
Чтобы получить ответ на вопрос,
необходимо указать фамилию, имя и адрес электронной почты.