
- •Олимпиадные задачи и решения
- •Векторы (100 баллов)
- •Погодные условия (100 баллов)
- •Шоколадные плитки (100 баллов)
- •Работники (100 баллов)
- •Робот (100 баллов)
- •Зал Круглых Столов (100 баллов)
- •Вто (100 баллов)
- •Вишня (100 баллов)
- •Алхимия (100 баллов)
- •Цепь (100 баллов)
- •Казино (100 баллов)
- •Система уравнений (100 баллов)
- •Забавный конфуз
- •Соревнование
- •Абракадабра
- •Циферблат
- •Многоугольники
- •Квадрат
- •Лабиринт
- •Задача “Шифр”
- •Задача “Школы”
- •Последовательность
- •Автобус
- •Головоломка
- •Электронная почта
- •Виртуляндия
- •Конвейер
- •Новости
Работники (100 баллов)
На заводе каждая из N деталей может быть обработанной на одном из двух станков: A или B. Каждая деталь имеет порядковый номер от 1 до N. К обработке детали поступают последовательно, в соответствии со своими номерами. Количество деталей всегда четно.
Существуют правила, по которым определяется можно ли обрабатывать деталь на определенном станке.
Если на текущий момент на станке B было обработано такое же количество деталей, как и на станке A, то следующая деталь должна быть обработана на станке A.
В итоге на каждом из станков должно быть обработано одинаковое количество деталей.
Сколько людей, столько и мнений. Каждый из работников этого завода предложил свою последовательность обработки деталей, причем все предложения оказались разными, но удовлетворяющими правилам 1 и 2.
Задание
Напишите программу STAFF, которая по информации о количестве деталей N определяет максимально возможное количество работников завода.
Входные данные
Единственная строка входного файла STAFF.DAT содержит четное число N (2≤N≤28) – количество деталей которое необходимо обработать.
Выходные данные
Единственная строка выходного файла STAFF.SOL должна содержать целое число – максимально возможное количество работников завода.
Пример входных и выходных данных
STAFF.DAT |
STAFF.SOL |
4 |
2 |
Первый работник считает, что на станке A необходимо обработать детали 1 и 2, а на станке B, соответственно, 3 и 4. Второй думает, что на станке A нужно обработать детали 1 и 3, а на станке B – детали 2 и 4. Других вариантов последовательности обработки не существует.
{ fp }
program Staff;
const
FILE_IN = 'STAFF.DAT';
FILE_OUT = 'STAFF.SOL';
MAX_DETAILS = 28;
PEOPLE : array[1..MAX_DETAILS] of LongInt =
(0, 1,
0, 2,
0, 5,
0, 14,
0, 42,
0, 132,
0, 429,
0, 1430,
0, 4862,
0, 16796,
0, 58786,
0, 208012,
0, 742900,
0, 2674440);
var
Fin : Text;
Fout : Text;
DetailsNum : Integer;
begin
Assign(Fin, FILE_IN);
Reset(Fin);
ReadLn(Fin, DetailsNum);
Close(Fin);
Assign(Fout, FILE_OUT);
Rewrite(Fout);
WriteLn(Fout, PEOPLE[DetailsNum]);
Close(Fout);
end.
Робот (100 баллов)
Робот движется по полю, которое состоит из N клеток, выстроенных в ряд. На каждой из клеток находится кубик определенного цвета.
До начала движения робот находится на первой клетке поля и не держит ни одного кубика. Находясь на клетке, робот может выполнить не более одного раза каждую из следующих операций: (1) положить кубик того же цвета, который лежит на текущей клетке; (2) поднять с клетки тот кубик, который находился там сначала. После этого робот перемещается на следующую клетку или останавливается, если текущая клетка последняя в поле.
Одновременно робот может держать не более K кубиков. На момент остановки робот не должен держать ни одного кубика.
Задание
Напишите программу ROBOT, которая по информации о цвете кубиков и ограничении на количество кубиков, которое может держать робот, определяет максимальное общее количество кубиков, которое робот может перенести с места на место, двигаясь по полю.
Входные данные
Первая строка входного файла ROBOT.DAT содержит символьную строку длинны N (1≤N≤1000). Строка состоит из маленьких букв латинского алфавита. Каждая буква соответствует клетке поля и определяет цвет кубика, который находится в этой клетке. Вторая строка содержит ограничение на количество кубиков, которое одновременно может держать робот K (1≤K≤25).
Выходные данные
Единственная строка выходного файла ROBOT.SOL должна содержать целое число — максимальное количество кубиков, месторасположение которых робот может изменить, двигаясь по полю.
Пример
входных и выходных данных
ROBOT.DAT |
ROBOT.SOL |
rgbbggrmcm 2 |
4 |
{ fp }
program Robot;
const
FILE_IN = 'ROBOT.DAT';
FILE_OUT = 'ROBOT.SOL';
MAX_SIZE = 1000;
MAX_K = 25;
var
N : Integer;
K : Integer;
Field : array[1..MAX_SIZE] of Char;
Prev : array[1..MAX_SIZE] of Integer;
Transfered : Integer; { The number of the transfered cubes }
Hands : array[1..MAX_K] of Integer;
procedure Init;
var
Fin : Text;
c : Char;
i : Integer;
Letter : array['a'..'z'] of Integer;
begin
Assign(Fin, FILE_IN);
Reset(Fin);
N := 0;
c := ' ';
while ( c <> Chr(10) ) do
begin
Read(Fin, c);
if (c in ['a'..'z']) then
begin
Inc(N);
Field[N] := c;
end;
end;
ReadLn(Fin, K);
Close(Fin);
{ Initialize Transfered }
Transfered := 0;
{ Initialize Hands }
for i:=1 to K do
Hands[i] := 0;
{ Initialize Prev }
for c:='a' to 'z' do
Letter[c] := 0;
for i:=1 to N do
begin
Prev[i] := Letter[Field[i]];
Letter[Field[i]] := i;
end;
end;
procedure Run;
var
i : Integer;
j : Integer;
MS : Integer; { The number of Maximal Suitable hand }
begin
for i:=1 to N do
begin
{ Check if we can put a cube in the i-th cell }
if (Prev[i] > 0) then
begin
{ Look for the most suitable hand to take the cube that lays on the cell Prev[i] }
MS := 0;
for j:=1 to K do
begin
if (Hands[j] <= Prev[i]) then
begin
if (MS = 0) then MS := j
else if (Hands[MS] < Hands[j]) then MS := j;
end;
end;
if (MS <> 0) then
begin
Inc(Transfered);
Hands[MS]:=i;
end;
end;
end;
end;
procedure Done;
var
Fout : Text;
begin
Assign(Fout, FILE_OUT);
Rewrite(Fout);
WriteLn(Fout, Transfered);
Close(Fout);
end;
begin
Init;
Run;
Done;
end.