Решение номера 7672 ФИПИ

На ускорителе для большого числа частиц производятся замеры скорости каждой из них. Скорость частицы – это целое число (положительное, отрицательное или 0). Частиц, скорость которых измерена, может быть очень много, но не может быть меньше трёх. Скорости всех частиц различны. В серии обязательно присутствует хотя бы одна частица с отрицательной скоростью.

 

При обработке результатов в каждой серии эксперимента отбирается основное множество скоростей. Это такое непустое подмножество скоростей частиц (в него могут войти как скорость одной частицы, так и скорости всех частиц серии), для которого произведение скоростей является минимальным среди всех возможных подмножеств. При нахождении произведения знак числа учитывается. Если есть несколько таких множеств, то берётся то, которое содержит наибольшее количество элементов.

 

Вам предлагается написать эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, BorlandPascal 7.0), которая будет обрабатывать результаты эксперимента, находя основное множество.

 

Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи.

 

На вход программе в первой строке подаётся количество частиц N. В каждой из последующих N строк записано одно целое число, по абсолютной величине не превышающее 109. Все N чисел различны.

 

Пример входных данных:

5

123

2

-1000

0

10

Программа должна вывести в порядке возрастания номера частиц, скорости которых принадлежат основному множеству данной серии. Нумерация частиц ведётся с единицы.

 

Пример выходных данных для приведённого выше примера входных данных:

1 2 3 5

 

Объяснение

Так как в последовательности есть как минимум одно отрицательное значение, то очевидно, что конечное произведение должно быть меньше нуля. Значит количество отрицательных сомножителей в множестве должно быть нечетным. Если на вход поступает четное количество отрицательных чисел, то нам надо выбрать номер максимального отрицательного числа и не включать его в последовательность. Положительные сомножители не влияют на знак конечного произведения, значит, чтобы произведение было как можно меньше, мы будем просто включать их в множество. По условию все скорости частиц различны, значит, если где-то в последовательности встречается ноль, то он встречается в первый и последний раз. Его в множество мы включать не будем, так как любое число умноженное на ноль дает ноль и произведение не будет наименьшим. Итак, в программе мы будем хранить 3 переменные: максимальное отрицательное число (m), номер максимального отрицательного числа (max_number) и номер нуля (zero_number). Чтобы определить четное или нечетное количество отрицательных переменных введем логическую переменную flag. Четному количеству будет соответствовать True, а нечетному False. Изначально вводим True и с каждым новым входом отрицательного числа меняем значение переменной на противоположное (Если было True, то меняем его на False и наоборот). В конце с помощью дополнительного цикла выводим номера, исключая номер нуля и (или) номер максимального отрицательного числа, если это понадобится.

 

Решение на языке Паскаль

Показать решение

 

Решение на языке Python

Показать решение

 

Похожие задачи: 7608, 7640

Раздел: Программирование

 

Оставить комментарий