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