Задание № 7488
В лаборатории для большого количества частиц производятся замеры электрического заряда каждой из них. Заряд частицы измеряется как целое число (положительное, отрицательное или 0). Частиц, заряд которых измерен, может быть очень много, но не может быть меньше трёх. Заряды всех частиц различны.
В серии обязательно присутствует хотя бы одна частица с отрицательным зарядом. При обработке результатов в каждой серии эксперимента отбирается основноемножество значений зарядов. Это такое непустое подмножество значений зарядов частиц (в него могут войти как заряд одной частицы, так и заряды всех частиц серии), для которого произведение значений зарядов является минимальным среди всех возможных подмножеств. При нахождении произведения знак числа учитывается. Если есть несколько таких множеств, то берётся то, которое содержит наибольшее количество элементов.
Вам предлагается написать эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая будет обрабатывать результаты эксперимента, находя основное множество.
Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи.На вход программе в первой строке подаётся количество частиц N. В каждой из последующих N строк записано одно целое число, по абсолютной величине не превышающее 109. Все N чисел различны.
<!—QuoteBegin—>Пример входных данных:
4
323
0
2
-999
<!—QuoteEnd—>Программа должна вывести в порядке возрастания номера частиц, заряды которых принадлежат основному множеству данной серии.
Нумерация частиц ведётся с единицы.
Пример выходных данных для приведённого выше примера входных данных: 1 3 4.
Содержание верного ответа
Основное множество состоит из всех значений зарядов, кроме 0, если он встречается, и кроме минимального по модулю отрицательного заряда, если отрицательных зарядов чётное число.Программа читает все входные данные один раз, не запоминая все входные данные в массиве, размер которого равен N. Во время чтения данных запоминается номер О, если он встретится (по условию все значения различны, поэтому 0 встречается не больше одного раза), подсчитывается количество отрицательных значений и ищется минимальное по модулю отрицательное значение.После окончания ввода распечатываются все номера, кроме номера 0 и номера минимального по модулю отрицательного значения, но только в случае, если их чётное число.
Ниже приведёны примеры решения задания на языках Паскаль и Бейсик. Допускаются решения, записанные на других языках программирования
\nПример правильной и эффективной программы на языке Паскаль
var n, i, j, k, с, min, a: longint; begin readln(n); min := -1000000001; k := 0; j : = 0; c : = 0 ; for i := 1 to n do begin readln(a); if a = 0 then j := i; if a < 0 then begin с : = с + 1 ; if a > min then begin min := a; k : = i; end end end; for i := 1 to n do if (i <> j) and ((c mod 2 <> 0) or (i <> k)) then write(i, ' ');end.
Пример правильной и эффективной программы на языке Бейсик
INPUT п min = 0 k = 0 j = 0 с = 0FOR i = 1 ТО n INPUT а IF а = 0 THEN j = i IF а < 0 THEN с = с + 1 IF (min = 0) OR (a > min) THEN min = a k = i END IF END IF NEXT iFOR i = 1 TO n IF (i <> j) AND ((c MOD 2 <> 0) OR (i <> k)) THEN PRINT i NEXT i END
Ответ: Нашли ошибку в задании? Выделите фрагмент и нажмите Ctrl + Enter.