Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инфорамтика C4 ответы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
912.38 Кб
Скачать

Var n, I, V, pMin, min, min2, max, max2: integer;

neg: boolean;

begin

readln(N);

readln(min);

readln(max);

if min < max then begin

min2 := max; max2 := min;

end

else begin

min2 := min; max2 := max;

min := max2; max := min2;

end;

for i := 1 to N-2 do begin

readln(v);

if v < min then begin

min2 := min; min := v;

end

else if v < min2 then min2 := v;

if v > max then begin

max2 := max; max := v;

end

else if v > max2 then max2 := v;

end;

pMin := min*min2;

if max*max2 < pMin then pMin := max*max2;

if max*min < pMin then pMin := max*min;

writeln(pMin)

end.

Заметим, что возможен более простой вариант этой задачи: найти максимальное произведение. Она решается еще проще: нужно найти два максимуму и два минимума, так же, как и в этой задаче, и найти максимальное из произведений min*min2, max*max2.

  1. По условию задачи нужно найти минимальную четную сумму из всех сумм пар введенных значений. Подумаем, как может получиться четная сумма при сложении двух чисел. Возможны два варианта:

  1. четное + четное;

  2. нечетное + нечетное.

Кроме того, если четной суммы нет (это значит, что введено всего два числа, одно четное, второе – нечетное), нужно вывести их сумму, которая одновременно будет минимальной. Таким образом, можно сделать важный вывод: если N=2, нужно просто вывести сумму двух последующих введенных чисел.

Если чисел больше 2, нужно хранить в памяти и постоянно корректировать два минимальных четных числа (для этого будем использовать переменные ch1 и ch2) и два минимальных нечетных числа (переменные nch1 и nch2); тогда результат – это минимальная из сумм ch1+ch2 и nch1+nch2.

Итак, сначала читаем их входного потока количество чисел N и сразу первые два числа последовательности в переменные v и v1:

readln(N);

readln(v);

readln(v1);

Записываем в переменные ch1, ch2, nch1 и nch2 число 60001, которое больше 60000, поэтому любое число входной последовательности при сравнении окажется меньше этого начального значения:

ch1:=60001; ch2:=60001;

nch1:=60001; nch2:=60001;

Кроме того, сумма любых двух чисел из реальной последовательности меньше, чем каждое из начальных значений (спасибо за замечание С. Давыдову).

Важно: здесь предполагается, что число 60001 помещается в ячейки ch1, ch2, nch1 и nch2. Например, можно использовать тип longint, если в вашей версии транслятора переменная типа integer имеет размер 2 байта.

Теперь нужно записать числа, находящиеся в переменных v и v1, в соответствующие рабочие переменные: ch1, ch2, nch1 и nch2. Если оба числа четных, то есть остатки от их деления на 2 равны 0, записываем их в ch1 и ch2 в порядке возрастания (меньшее – в ch1).

if (v mod 2 = 0) and (v1 mod 2 = 0) then begin

if v < v1 then begin

ch1 := v; ch2 := v1;

end

else begin

ch1 := v1; ch2 := v;

end;

end;

Аналогично нечётные числа записываем их в nch1 и nch2 в порядке возрастания (меньшее – в nch1). Если одно число четное, а второе – нечетное, записываем их в ch1 и nch1:

if v mod 2 <> v1 mod 2 then begin

if v mod 2 = 0 then begin

ch1 := v; nch1 := v1;

end

else begin

nch1 := v; ch1 := v1;

end;

end;

Теперь в цикле читаем остальные N-2 чисел входной последовательности:

for i := 1 to N-2 do begin

readln(v);

... { обработать v }

end;

Обработка сводится к тому, что мы определяем, четное число прочитано в v или нет, а затем ищем, соответственно среди четных или нечетных чисел, два минимума (см. первую разобранную задачу в файле C4.doc и решение задачи 42 выше):

if v mod 2 = 0 then begin { если введено четное число }

if v < ch1 then begin

ch2 := ch1; ch1 := v;

end

else if v < ch2 then ch2 := v;

end

else { если введено нечетное число }

if v < nch1 then begin

nch2 := nch1; nch1 := v;

end

else if v < nch2 then nch2 := v;

Остается вывести результат. Если N=2, то после окончания цикла выводим просто сумму v+v1 (сумму первых двух введенных чисел). Иначе выбираем минимальное из ch1+ch2 и nch1+nch2:

if N = 2 then writeln(v + v1)

else

if ch1+ch2 < nch1+nch2 then

writeln(ch1+ch2)

else writeln(nch1+nch2)

Заметим, что вывод работает верно и в том случае, когда введено одно нечетное число и два больших четных. Например (N=3):

15

29000

29000

В этом случае значения переменных будут такие:

ch1 = 29000 ch2 = 29000

nch1 = 15 nch2 = 60001

Видим, что в nch2 осталось начальное значение, равное 60001, что больше суммы двух любых правильных чисел входной последовательности. Поэтому имеем

ch1+ch2 = 29000+29000 = 58000 < nch1+nch2 = 15+60001 = 60016

В результате будет выведен правильный ответ 58000.

Вот полная программа: