По каналу связи передаются положительные целые числа, не превышающие 1000, — результаты измерений, полученных в ходе эксперимента (количество измерений N известно заранее, гарантируется, что N > 2). После окончания эксперимента передаётся контрольное значение — наибольшее число R, удовлетворяющее следующим условиям:
1) R — сумма двух различных переданных элементов последовательности («различные» означает, что нельзя просто удваивать переданные числа, суммы различных, но равных по величине элементов допускаются);
2) R — чётное число. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены.
Напишите программу (укажите используемую версию языка программирования, например Free Pascal 2.6.4), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме:
Вычисленное контрольное значение:
…
Контроль пройден (или Контроль не пройден)
Постарайтесь, чтобы программа была эффективной. Программа считается эффективной по времени, если время работы программы пропорционально количеству полученных показаний прибора N, то есть при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Перед текстом программы кратко опишите используемый Вами алгоритм решения.
На вход программе в первой строке подаётся количество чисел N (N > 2). В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение. Пример входных данных:
6
100
8
33
145
19
84
184
Пример выходных данных для приведённого выше примера входных данных: Вычисленное контрольное значение: 184.
Сумма двух чисел чётна, если они имеют одинаковую чётность (оба чётные или оба нечётные). Программа, вычисляющая контрольное значение, читает все входные данные один раз, не запоминая их в массиве. Для прочитанного фрагмента входной последовательности программа хранит значения двух самых больших чётных и двух самых больших нечётных чисел:
М01 — самое большое чётное число;
М02 — второе по величине чётное число;
M11 — самое большое нечётное число.
М12 — второе по величине нечетное число;
После того как все данные прочитаны, искомое контрольное значение вычисляется, как большая из сумм M01+M02 и M11+M12.
Поскольку N > 2, обязательно найдётся хотя бы одна пара чисел одинаковой четности и контрольное значение всегда будет вычислено, но надо отдельно обработать случаи, когда среди данных нет пары чётных или пары нечётных элементов. Эту проверку следует делать очень аккуратно. Например, следующий очень похожий на правильный фрагмент на самом деле ошибочен:
if (M12=0) or (M01+M02 > M11+M12) then res:=M01+M02 else res := M11+M12
Этот фрагмент даст неверный результат, например, при M01=100, M02=0, M11=25, M12=13.
Ниже приведены правильно реализующие описанный алгоритм программы на языке Паскаль, а также на алгоритмическом языке. Допускаются решения, записанные на других языках программирования.
Пример правильной и эффективной программы на языке Паскаль
var M01,M02,M11,M12,res,i,N,x,R: longint;
begin
M01 := 0; M02:=0;
M11 := 0; M12:=0;
readln(N);
for i := 1 to N do
begin
readln(x);
if x mod 2 = 0 then begin
if x > M01 then begin
M02:=M01; M01:=x
end
else if x > M02 then M02:=x;
end
else begin
if x > M11 then begin
M12:=M11; M11:=x
end
else if x > M12 then M12:=x;
end
end;
if M02=0 then res:=M11+M12
else if M12=0 then res:=M01+M02
else if M01+M02 > M11+M12 then res := M01+M02
else res := M11+M12
writeln('Вычисленное контрольное значение: ',res);
readln(R);
if R = res
then writeln('Контроль пройден')
else writeln('Контроль не пройден');
end.
Пример правильной и эффективной программы на алгоритмическом языке
алг
нач
цел N | количество чисел на входе
цел x | исходные данные
цел m01=0
цел m02=0
цел m11=0
цел m12=0
цел R | введенное контрольное значение
цел res | вычисленное контрольное значение
ввод N
нц N раз
ввод x
если mod(x,2) = 0 то
выбор
при x > m01:
m02:=m01; m01:=x
при x > m02:
m02:=x
все
иначе
выбор
при x > m11:
m12:=m11; m11:=x
при x > m12:
m12:=x
все
кц
выбор
при m02=0: res:=m11+m12
при m12=0: res:=m01+m02
при m01+m02 > m11+m12: res:=m01+m02
иначе res:=m11+m12
все
вывод нс, 'Вычисленное контрольное значение: ',res
ввод R
если R=res
то вывод нс, "Контроль пройден"
иначе вывод нс, "Контроль не пройден"
все
кон

