Условие:
Изучая звездные скопления, астрономы измеряют лучевые скорости
некоторого количества входящих в них
звезд. В качестве кинематической
характеристики скопления было решено использовать максимальное,
т.е. взятое с учетом знака, значение из всевозможных
попарных произведений измеренных скоростей звезд.
Предлагается написать эффективную, в том числе и по используемой
памяти, программу, которая будет находить искомую величину для каждого из
изучаемых скоплений. Следует учитывать, что
лучевые скорости могут принимать
положительные, отрицательные или
нулевые значения. Количество измеренных скоростей для каждого из скоплений
может быть очень большим, но не может быть меньше 2.
Перед текстом программы кратко
опишите алгоритм решения.
Для каждого скопления на вход программе в первой строке подается
количество измеренных скоростей звезд N.
В каждой из последующих N строк приводится значение скорости, записанное в виде целого числа, по абсолютной величине не превышающего 3000.
В каждой из последующих N строк приводится значение скорости, записанное в виде целого числа, по абсолютной величине не превышающего 3000.
Вариант решения:
Program
C4-astro;
{Наибольшее произведение скоростей может быть получено как произведение двух положительных или двух отрицательных скоростей, поэтому программа ищет две максимальные и две минимальные скорости из набора данных, а затем выбирает
большее из этих произведений в качестве окончательного результата}
{Наибольшее произведение скоростей может быть получено как произведение двух положительных или двух отрицательных скоростей, поэтому программа ищет две максимальные и две минимальные скорости из набора данных, а затем выбирает
большее из этих произведений в качестве окончательного результата}
Var min1,
min2, max1, max2, N, i, v: longint;
N,i: integer;
N,i: integer;
{использование типа longint важно, так как произведение достаточно больших целых чисел может выходить за пределы типа integer}
Begin
ReadLn(N);
ReadLn(N);
Max1 := -3001; {задаем
любое число, меньшее 3000}
Min1 := +3001; {задаем
любое число, большее 3000}
For i
:= 1 to N do
Begin
ReadLn(v);
if v >= max1 then
Begin
Max2:=max1;
Max1:=v
End
Else
if v>max2 then Max2:=v;
if v <= min1 then
Begin
Min2:=min1:
Min1:=v
End
Else
if v < min2 then Min2:=v
End;
if max1*max2
> min1*min2 then
WriteLn(max1*max2)
Else
WriteLn(min1*min2)
End.
Комментариев нет:
Отправить комментарий