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