Задание № 7542
От цифровых датчиков в компьютер поступает информация о характеристиках физического процесса. Результатом каждого измерения является неотрицательное целое число.
Вам предлагается написать эффективную, в том числе по используемой памяти, программу, которая будет выводить третье по величине (считая от максимума) значение измерения. Если несколько измерений имеют одинаковые значения, то они учитываются как одно измерение. Если искомого значения не существует (например, когда все значения измерений равны), то нужно вывести символ «#». Следует учитывать, что количество измерений может быть очень велико.
Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи. На вход программе в первой строке подаётся общее количество N значений измерений. В каждой из последующих N строк записано целое число. Гарантируется, что N > 1, то есть всегда имеется хотя бы одно измерение.
Пример входных данных:
5
100
10
100
10
100
Пример выходных данных для приведённого выше примера входных данных:
#
Содержание верного ответа
Программа последовательно читает значения измерений, обновляя при необходимости три наибольших значения. После цикла печатается результат.
Баллы начисляются только за программу, которая решает задачу хотя бы для одного частного случая. Ниже приведёны примеры решения задания на языках Паскаль, Бейсик и алгоритмическом языке. Допускаются решения, записанные на других языках программирования
Пример правильной и эффективной программы на языке Бейсик
DIM N, Max, Next_Max, Next_Next_Max, i, s AS Integer
Max = -1: Next_Max = -1
Next_Next_Max = -1
INPUT N
REM Считываем количество измерений
FOR i = 1 to N
INPUT s
REM Считали очередное значение
IF s > Max THEN
REM обновление всех трёх максимумов
Next_Next_Max = Next_Max: Next_Max = Max: Max = s
ELSE
IF (s > Next_Max) AND (s <> Max) THEN
REM обновление 2-го и 3-го максимума
Next_Next_Max = Next_Max: Next_Max = s
ELSE
IF (s > Next_Next_Max) AND (s <> Max) AND (s <> Next_Max) THEN
REM обновление 3-го максимума
Next_Next_Max = s
END IF
END IF
END IF
NEXT i
REM Вывод результата
IF Next_Next_Max > -1 THEN
PRINT Next_Next_Max
ELSE
PRINT '#'
END IF
Пример правильной и эффективной программы на языке Паскаль
Var N, Max, Next_Max, Next_Next_Max, i, s: integer;
begin
Max := -1; Next_Max := -1; Next_Next_Max := -1;
ReadLn (N); {Считываем количество измерений}
for i := 1 to N do begin
ReadLn (s); {Считали очередное значение}
if s > Max then begin
{обновление всех трёх максимумов}
Next_Next_Max := Next_Max; Next_Max := Max; Max := s;
end
else if (s > Next_Max) and (s <> Max) then begin
{обновление 2-го и 3-го максимума}
Next_Next_Max := Next_Max;
Next_Max := s;
end
else if (s > Next_Next_Max) and (s <> Max) and (s <> Next_Max) then
{обновление 3-го максимума}
Next_Next_Max := s;
end; {Вывод результата}
if Next_Next_Max > -1 then
WriteLn (Next_Next_Max)
else WriteLn ('#');
end.
Ответ: Нашли ошибку в задании? Выделите фрагмент и нажмите Ctrl + Enter.