Задачи С4 с разбором и для самостоятельного решения

advertisement
Задача С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
Download