Задание № 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.