Qu1nt, кстати, что в вашем примере, что в моем есть несоответствие условию задачи (если я правильно понял)
Цитата(Lacoste1024 @ 7.6.2012, 01:32 ) | | из набора чисел отобрать минимальную пару чётных чисел, а если такой нет, то просто минимальную пару |
К примеру, на таком наборе введенных данных
наши примеры выдадут ответ 1 + 3 = 4 А должно быть 0 + 1 = 1. Следовательно, надо перед выдачей ответа ставить дополнительную проверку на случай, когда есть только одно четное число в наборе, и оно меньше одного из найденных (или обоих) наименьших нечетных.
Приложу свой исправленный вариант:
| Код | program FindMinOddPair;
{$APPTYPE CONSOLE}
procedure Solve; var N: Integer; Min, NextMin, FirstEven, Curr: Word; begin Min := High(Word); if not Odd(Min) then Dec(Min); // put an odd number initially NextMin := Min; FirstEven := 1; // put an odd number initially Readln(N); while N > 0 do begin Readln(Curr); if (Odd(Min) = Odd(NextMin)) and (Odd(Min) = Odd(Curr)) then begin // Min, NextMin and Curr are all either odd or even if Curr < Min then // Let Min always be less than or equal to NextMin Min := Curr else if Curr < NextMin then NextMin := Curr; end else if not Odd(Curr) then // Both Min and NextMin are odd, and Curr is even if FirstEven = 1 then FirstEven := Curr // Store the first even number detected else if FirstEven < Curr then // Let Min always be less than or equal to NextMin begin Min := FirstEven; NextMin := Curr; end else begin Min := Curr; NextMin := FirstEven; end; Dec(N); end;
if Odd(Min) then // Here, both Min and NextMin are of the same parity if FirstEven <> 1 then // The only even number in an input set if FirstEven < Min then begin NextMin := Min; Min := FirstEven; end else if FirstEven < NextMin then NextMin := FirstEven;
Writeln(Min, ' + ', NextMin, ' = ', Min + NextMin); end;
begin
Solve(); Readln;
end.
|
|