Задача С4 (экзамен 2013г.) На ускорителе для большого числа частиц производятся замеры скорости каждой из них. Чтобы в документации качественно отличать одну серию эксперимента от другой, каждую серию решили характеризовать числом, равным максимальной четной сумме, которую можно получить, складывая скорости некоторых частиц, данной серии. То есть требуется выбрать такое непустое подмножество частиц (в него может войти как одна частица, так и все частицы серии), сумма значений скоростей у которого будет четной и максимально возможной. Если таких подмножеств несколько, то нужно выбрать любое подмножество, состоящее из как можно меньшего числа элементов. Вам предлагается написать эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет обрабатывать результаты эксперимента, находя искомое подмножество. В нашей модели скорость частицы – это целое неотрицательное число. Частиц, скорость которых измерена, может быть очень много, но не может быть меньше трех. Скорости всех частиц различны. Перед текстом программы кратко опишите используемый вами алгоритм решения задачи. На вход программе в первой строке подается количество частиц N. В каждой из последующих N строк записано одно целое неотрицательное число не превышающее 109. Все N чисел различны. Пример входных данных: 5 123 2 1000 0 10 Программа должна вывести в порядке возрастания номера частиц, сумма скоростей которых будет характеризовать данную серию. Нумерация частиц ведется с единицы. Пример выходных данных для приведенного выше примера входных данных: 235 Решение: Идея: Характеристикой серии является сумма всех значений скоростей, кроме нуля, если он встречается, и кроме минимального нечетного значения, если таких значений нечетное число. Программа читает все входные данные один раз, не запоминая все входные данные в массиве, размер которого равен N. Во время чтения данных запоминается номер нуля, если он встретится (по условию все значения различны, поэтому ноль встречается не больше одного раза), подсчитывается количество нечетных значений и ищется минимальное нечетное значение. После окончания ввода распечатываются все номера, кроме номера нуля и номера минимального нечетного значения, но только в случае, если их количество нечетно. var n,i,j,k,c,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 mod 2 <> 0 then begin c := c + 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. Задача для самостоятельного решения: На ускорителе для большого числа частиц производятся замеры скорости каждой из них. Скорость частицы - это целое неотрицательное число. Частиц, скорость которых измерена, может быть очень много, но не может быть меньше трёх. Скорости всех частиц различны. Скорость, по крайней мере, одной частицы нечётна. При обработке результатов в каждой серии эксперимента отбирается основное множество скоростей. Это непустое подмножество скоростей частиц (в него могут войти как скорость одной частицы, так и скорости всех частиц серии), такое, что сумма значений скоростей у него нечётна и максимальна среди всех возможных непустых подмножеств с нечётной суммой. Если таких подмножеств несколько, то из них выбирается то подмножество, которое содержит наименьшее количество элементов. Вам предлагается написать эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет обрабатывать результаты эксперимента, находя основное множество. Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи. На вход программе в первой строке подаётся количество частиц N. В каждой из последующих N строк записано одно целое неотрицательное число, не превышающее 109. Все N чисел различны. Хотя бы одно из чисел нечётно. Пример входных данных: 3 123 0 2 Программа должна вывести в порядке возрастания номера частиц, скорости которых принадлежат основному множеству данной серии. Нумерация частиц ведётся с единицы. Пример выходных данных для приведённого выше примера входных данных: 1 3 В других вариантах эта же задача! Задача С4 «Канал связи» Демо-2014 По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно, но может быть очень велико. Затем передаётся контрольное значение последовательности – наибольшее число R, удовлетворяющее следующим условиям: 1) R – произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел; допускаются произведения различных элементов последовательности, равных по величине); 2) R делится на 21. Если такого числа R нет, то контрольное значение полагается равным 0. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены. Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме: Вычисленное контрольное значение: … Контроль пройден (или – Контроль не пройден) Перед текстом программы кратко опишите используемый Вами алгоритм решения. На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение. Пример входных данных: 6 70 21 997 7 9 300 21000 Пример выходных данных для приведённого выше примера входных данных: Вычисленное контрольное значение: 21000 Контроль пройден__ Краткое описание алгоритма: Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырёх величин: М7 – самое большое число, кратное 7, но не кратное 3; M3 – самое большое число, кратное 3, но не кратное 7; M21 – самое большое число, кратное 21; МAX – самое большое число среди всех элементов последовательности, отличное от М21 (если число М21 встретилось более одного раза и оно же является максимальным, то MAX = M21). После того как все данные прочитаны, искомое контрольное значение вычисляется как максимум из произведений М21*MAX и М7*М3. Решение: var M7,M3,M21,R,MAX,dat,res,i,N: longint; begin M7 := 0; M3 := 0; M21 := 0; MAX := 0; readln(N); for i := 1 to N do {Перебираем все N чисел} begin readln(dat); {dat – очередное число} if ((dat mod 7) = 0) and ((dat mod 3) > 0) and (dat > M7) then {нашли новое M7} M7 := dat; if ((dat mod 3) = 0) and ((dat mod 7) > 0) and (dat > M3) then {нашли новое M3} M3 := dat; if (dat mod 21 = 0) and (dat > M21) then {нашли новое M21} begin if M21 > MAX then MAX := M21; {если текущее M21 больше текущего MAX} M21 := dat end else if dat > MAX then MAX := dat; end; readln(R); if (M7*M3 < M21*MAX) then res := M21*MAX else res := M7*M3; writeln('Вычисленное контрольное значение: ',res); if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден'); end. Задачи для самостоятельного решения: 1 задача. По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно, но может быть очень велико. Затем передаётся контрольное значение последовательности - наибольшее число R, удовлетворяющее следующим условиям: 1) R - произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел, произведения различных элементов последовательности, равных по величине, допускаются); 2) R делится на 22. Если такого числа R нет, то контрольное значение полагается равным 0. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены. Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме: Вычисленное контрольное значение: ... Контроль пройден (или— Контроль не пройден) Перед текстом программы кратко опишите используемый Вами алгоритм решения. На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение. Пример входных данных: б 55 997 22 7 400 22000 Пример выходных данных для приведённого выше примера входных данных: Вычисленное контрольное значение: 22000 Контроль пройден 2 задача. По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно, но может быть очень велико. Затем передаётся контрольное значение последовательности - наибольшее число R, удовлетворяющее следующим условиям: 1) R - произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел, произведения различных элементов последовательности, равных по величине, допускаются); 2) R делится на 33. Если такого числа R нет, то контрольное значение полагается равным 0. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены. Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме: Вычисленное контрольное значение: ... Контроль пройден (или- Контроль не пройден) Перед текстом программы кратко опишите используемый Вами алгоритм решения. На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение. Пример входных данных: б 550 33 7 997 9 60 33000 Пример выходных данных для приведённого выше примера входных данных: Вычисленное контрольное значение: 33000 Контроль пройден Задача С4 «Камеры хранения» На вход программе подаются сведения о пассажирах, желающих сдать свой багаж в камеру хранения на заранее известное время до полуночи. В первой строке сообщается число пассажиров N, которое не меньше 3, но не превосходит 1000; во второй строке – количество ячеек в камере хранения K, которое не меньше 10, но не превосходит 1000. Каждая из следующих N строк имеет следующий формат: <Фамилия> <время сдачи багажа> <время освобождения ячейки>, где <Фамилия> – строка, состоящая не более чем из 20 непробельных символов; <время сдачи багажа> – через двоеточие два целых числа, соответствующие часам (от 00 до 23 – ровно 2 символа) и минутам (от 00 до 59 – ровно 2 символа); <время освобождения ячейки> имеет тот же формат. <Фамилия> и <время сдачи багажа>, а также <время сдачи багажа> и <время освобождения ячейки> разделены одним пробелом. Время освобождения больше времени сдачи. Сведения отсортированы в порядке времени сдачи багажа. Каждому из пассажиров в камере хранения выделяется свободная ячейка с минимальным номером. Если в момент сдачи багажа свободных ячеек нет, то пассажир уходит, не дожидаясь освобождения одной из них. Требуется написать программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая будет выводить на экран для каждого пассажира номер ему предоставленной ячейки (можно сразу после ввода данных очередного пассажира). Если ячейка пассажиру не предоставлена, то его фамилия не печатается. Пример входных данных: 3 10 Иванов 09:45 12:00 Петров 10:00 11:00 Сидоров 12:00 13:12 Результат работы программы на этих входных данных: Иванов 1 Петров 2 Сидоров 1 Идея состоит в том, чтобы хранить и сравнивать моменты времени как символьные строки, без преобразования. Действительно, цифры в кодовой таблице ASCII расположены подряд по возрастанию, так что '00:00' < '00:01' < …'23:58' < '23:59' Поэтому не нужно переводить время в формат целого числа, и анализ строки упрощается: p:= Pos(' ', s); fam:= Copy(s,1,p-1); { выделяем фамилию } Delete(s,1,p); { удаляем ее вместе с пробелом } startTime:= Copy(s,1,5); { время сдачи багажа } endTime:= Copy(s,7,5); { время выдачи багажа } Дальше остается только найти ячейку, у которой время освобождения меньше, чем время сдачи текущего багажа startTime. Полная программа: Const MAXPASS = 1000; MAXCELLS = 1000; var N, K: integer; i, p, cellNo, count: integer; s, fam, sCell: string; startTime, endTime: string; cellFreeTime: array [1..MAXCELLS] of string; {массив со временем освобождения камер хранения} pass: array[1..MAXPASS] of string;{ массив с пассажирами и соответствующими камерами} begin readln(N); readln(K); { записываем нулевые значения времени } for cellNo:= 1 to k do cellFreeTime[cellNo]:='00:00'; count:= 0; for i:= 1 to N do begin readln(s); { разбор строки } p:= Pos(' ', s); fam:= Copy(s,1,p-1); { выделяем фамилию } Delete(s,1,p); { удаляем ее вместе с пробелом } startTime:= copy(s,1,5); { время сдачи багажа } endTime:= copy(s,7,5); { время выдачи багажа } { поиск свободной ячейки } cellNo:= 1; {номер текущей проверяемой камеры} while cellNo <= k do begin if startTime >= cellFreeTime[cellNo] then begin cellFreeTime[cellNo]:= endTime; Inc(count); Str(cellNo, sCell); pass[count] := fam + ' ' + sCell; break; end; Inc(cellNo);{ переход к следующей камере} end; end; { вывод результата } for i:=1 to count do writeln(pass[i]); end. Задача для самостоятельного решения (Демо 2012): В командных олимпиадах по программированию для решения предлагается не больше 11 задач. Команда может решать предложенные задачи в любом порядке. Подготовленные решения команда посылает в единую проверяющую систему соревнований. Вам предлагается написать эффективную, в том числе по используемой памяти, программу, которая будет статистически обрабатывать пришедшие запросы, чтобы определить наиболее популярные задачи. Следует учитывать, что количество запросов в списке может быть очень велико, так как многие соревнования проходят с использованием Интернет. Перед текстом программы кратко опишите используемый вами алгоритм решения задачи. На вход программе в первой строке подаётся количество пришедших запросов N. В каждой из последующих N строк записано название задачи в виде текстовой строки. Длина строки не превосходит 100 символов, название может содержать буквы, цифры, пробелы и знаки препинания. Пример входных данных: 6 А+B Крестики-Нолики Прямоугольник Простой делитель А+В Простой делитель Программа должна вывести список из трёх наиболее популярных задач с указанием количества запросов по ним. Если в запросах упоминаются менее трех задач, то выведите информацию об имеющихся задачах. Если несколько задач имеют ту же частоту встречаемости, что и третья по частоте встречаемости задача, их тоже нужно вывести. Пример выходных данных для приведённого выше примера входных данных: А+В 2 Простой делитель 2 Крестики-Нолики 1 Прямоугольник 1