@ ОТВЕТЫ И РЕШЕНИЯ

advertisement
ИНФ ОР М АТИКА
@ ОТВЕТЫ И РЕШЕНИЯ
Разбор решений задач заочного II тура конкурса «Лидер “Жас талап-KZ”»,
опубликованных в №4(24), 2010 г.
Материал подготовил Василий Львович Никифоров,
кандидат технических наук, профессор кафедры информационных систем
(Inf_201) Задача «Повар»
Имя входного файла
Имя выходного файла
Максимальная оценка
Ограничение времени: 10 секунд
Inf_101.in
Inf_101.out
4
Главный повар решил устроить в лицее День уважения к Повару. Для этого он приготовил лицеистам N необычайно вкусных котлет и втайне постановил, что первый пожаловавший отведать поварское кушанье школьник должен получить наибольшее количество вкусных котлет, а каждый последующий - строго меньше, чем предыдущий (повару очень не
нравилось, когда к приготовленному им обеду опаздывали, и тот остыл).
Конечно, введенное правило оставляет существенный произвол в числе котлет, получаемых очередным явившимся лицеистом, и это число не в последнюю очередь будет зависеть от предыдущего поведения лицеиста в столовой, а также от волшебных слов, произносимых им.
Например, 6 котлет могут быть в результате распределены по одной из следующих четырех схем: 3+2+1 (три котлеты первому из пришедших школьников, две - второму и одну третьему); 4+2, 5+1 и 6 (все котлеты съедает счастливчик, пришедший первым).
Напишите программу, определяющую, каким количеством различных способов повар
может распределить приготовленное лакомство среди школьников.
Формат входных данных. Входной файл содержит одно целое число N - количество
приготовленных поваром котлет (0<=N<=200).
Формат выходных данных. Выходной файл должен содержать одно целое число, равное количеству возможных распределений котлет (при указанных ограничениях ответ входит
в тип Longint).
Алгоритм решения задачи основан на переборе всех возможных вариантов комбинаций:
- первый лицеист получил больше котлет, чем второй (i>j);
- второй лицеист получил больше котлет, чем третий (j>k);
- сумма всех котлет должна равняться N.
В этот алгоритм не вписывается требование, что все котлеты съедает счастливчик, пришедший первым, поэтому исходное значение суммы равно единице.
Количество циклических операций можно сократить, если ограничить значение второго и
третьего циклов до n/2, но идея алгоритма останется прежней.
Код решения задачи:
Program povar;
Var N,i,j,s,k:Integer;
Begin
Assign(Input,'Inf_201.in');
Reset(Input);
Assign(Output,'Inf_201.out');
Rewrite(Output);
Readln(N);
s:=1;
ЖАС ТАЛАП-KZ
№2(26), июнь 2011
for i:=0 to n do
for j:=0 to n do
for k:=0 to n do
if (i>j) and (j>k) and (i+j+k=n) then s:=s+1;
writeln(s);
Close(Input);
Close(Output);
End.
65
ИНФ ОР М АТИКА
(Inf_202) Задача «Список»
Имя входного файла
Имя выходного файла
Максимальная оценка
Inf_202.in
Inf_202.out
5
В фирме, выпускающей компьютерные комплектующие, все изделия получают последовательные номера от 1 до N. Каждое изделие после его изготовления поступает в отдел
контроля качества, где оно проверяется и либо уходит в продажу, либо заносится в список
бракованных изделий и списывается.
К сожалению, список бракованных изделий иногда оказывается чересчур длинным. Тогда для его сокращения подряд идущие числа заменяются интервалом: через тире указываются номера первого и последнего изделия интервала. Например, вместо:
1,3,4,5,6,7,8,10,12,16,17,20,21,22,23,24 записывается: 1,3-8,10,12,16-17,20-24.
Напишите программу, которая по полному списку номеров бракованных изделий, выдаст
этот список в сокращенном виде.
Формат входных данных. Входной файл содержит число N - общее количество изделий, затем число M - количество изделий, оказавшихся бракованными. Далее в возрастающем порядке номера бракованных изделий.
Формат выходных данных. Выходной файл должен содержать список номеров бракованных изделий в сокращенном виде. Интервалы должны разделяться запятой. В строке не
должно быть пробелов.
Ограничения: 1<=M<=N<=1000000.
По традиции, правильные решения задач, присланные школьниками, публикуются в качестве основного варианта решения. Для данной задачи, в качестве основного варианта,
выбрано решение, присланное А. Рахметуллиной (школа № 3 г. Усть-Каменогорска).
Идея алгоритма основана на проверке значений номеров бракованных изделий, стоящих
во входном файле рядом. Если это не следующий номер цикла (номера изделий не идут
подряд), то выводятся номер бракованного изделия через запятую write(a[k],',') (предусмотрена проверка вывода номера последнего изделия – запятая не ставится write(a[k])), иначе
выводится последовательность номеров изделий в виде write(a[n],'-',a[k],',') – также предусмотрен вывод последней последовательности номеров без запятой.
Код программы имеет следующий вид:
Program comp;
begin
Var i,m,n,c,n1,k:integer;
k:=i;
A : array[1..1000] of integer;
if n=0 then begin
BEGIN
if k=m then write(a[k])
Assign(Input,'Inf_202.in');
else write(a[k],',')
Reset(Input);
end
Assign(Output,'Inf_202.out');
else begin
Rewrite(output);
if k=m then begin
n:=0; k:=0;
write(a[n],'-',a[k]);
Readln(n1,m);
n:=0; k:=0;
For i:=1 to m do
end
Begin
else begin
Readln(c);
write(a[n],'-',a[k],',');
a[i]:=c;
n:=0; k:=0;
end;
end;
For i:=1 to m do
end;
Begin
end;
if a[i]=a[i+1]-1
end;
then begin
Close(Input);
if n=0 then n:=i;
Close(Output);
end
END.
else
66
ЖАС ТАЛАП-KZ
№2(26), июнь 2011
ИНФ ОР М АТИКА
(Inf_203) Задача «Метро»
Имя входного файла
Имя выходного файла
Максимальная оценка
Inf_203.in
Inf_203.out
6
В мегаполисе, испытывающем большие транспортные проблемы, построили легкое метро. Оно состоит из 6 радиальных линий, которые расходятся из центра города, и k кольцевых линий в форме правильных шестиугольников. Станции метро располагаются на пересечении кольцевых и радиальных линий. На любой станции разрешено делать пересадки с
кольцевых линий на радиальные и обратно.
Радиальные линии последовательно нумеруются по часовой стрелке от 1 до 6. Кольцевые линии нумеруются от центра города (центр считается кольцевой линией с номером
ноль, состоящей из одной станции). Расстояние между двумя соседними станциями на одной радиальной линии равно 1 км. Расстояние между соседними станциями на кольцевой
линии с номером i составляет i км. Любая станция обозначается парой чисел - номером радиальной линии r (1<=r<=6) и номером кольцевой линии k (0<=k<=32000), на пересечении
которых она находится.
Напишите программу, определяющую длину кратчайшего пути между станциями.
Формат входных данных. Входной файл содержит четыре числа - r1, k1, r2, k2 - координаты начальной и конечной станции.
Формат выходных данных. Выходной файл должен содержать расстояние (в км), которое потребуется проехать пассажиру, чтобы попасть c начальной станции на конечную.
Пример
Inf_203.in
Inf_203.out
2063
3
Первоначально необходимо проверить ситуацию, когда Вам необходимо перемещаться
по одной радиальной линии (1 и 4, 2 и 5, 3 и 6) с учетом того, что между станциями находится центр или обе станции находятся по одну сторону от центра.
Согласно условию задачи радиальные линии метро r и r+1 вместе с кольцевыми линиями образуют равносторонние треугольники. Поэтому в остальных случаях для определения
длины кратчайшего пути между станциями необходимо:
- первоначально перемещаться по радиальной линии до совпадения кольцевых линий;
- перемещаться по кольцевой линии. На этом этапе необходимо выбрать минимальный
путь перемещения – двигаться «по» или «против» часовой стрелки кольцевой линии.
С учетом приведенных указаний код программы имеет следующий вид:
Program metro;
Var r1,r2,k1,k2,put,n,k:integer;
Begin
Assign(Input,'Inf_203.in');
Reset(Input);
Assign(Output,'Inf_203.out');
Rewrite(Output);
Read(r1,k1,r2,k2);
put:=0;
If r1=r2 then put:= abs(k2-k1);
If abs(r1-r2)=3 then put:=k1+k2;
ЖАС ТАЛАП-KZ
№2(26), июнь 2011
If (abs(r1-r2)=1) or (abs(r1-r2)=5) then
begin n:=abs(k1-k2);if k1>k2 then k:=k2 else
k:=k1; put:=n+k; end;
If (abs(r1-r2)=2) or (abs(r1-r2)=4) then
begin n:=abs(k1-k2);if k1>k2 then k:=k2 else
k:=k1; put:=n+2*k; end;
Write(put);
Close(Input);
Close(Output);
End.
67
Download