Предлагается решение олимпиадной задачи одного из этапов Всероссийской олимпиады школьников по информатике. Буду рад, если кому-нибудь из коллег или школьников, материал будет полезен
Задача
Чтобы поднять на N-й этаж M-этажного дома новый холодильник, Витя вызвал бригаду грузчиков. Оплата работы грузчиков производится так: за подъем холодильника на один этаж требуется заплатить 200 рублей, за спуск на один этаж - 100 рублей. За подъем и спуск на лифте плата не взимается. Несмотря на то, что в Витином доме есть лифт, ему возможно все же придется заплатить грузчикам, поскольку лифт останавливается только на каждом K-м этаже, начиная с первого (то есть на этажах с номерами 1, K+1, 2K+1, 3K+1, ...). Требуется вычислить, какой минимальной суммы денег достаточно, чтобы грузчики доставили холодильник с первого этажа на N-й.Формат входных данных
Во входном файле записаны три числа: M (2<M<100), N (2<N<M) и K (2<K<M-1), разделенные пробелами.
Формат выходных данных
В выходной файл выведите одно число - минимальную стоимость подъема холодильника.
Примеры
a_in.txt
|
a_out.txt
|
20 7 4
|
200
|
20 7 2
|
0
|
Решение
Var m,n,k,s1,s2,et:integer;F,f1:text;
Begin
assign(f,’a_in.txt'); {Связываем файловую переменную с файлом данных}
reset(f); {Открываем файл данных для чтения}
assign(f1,’a_out.txt'); {Связываем файловую переменную с файлом результатов}
rewrite(f1); {Открываем файл данных для записи результата}
readln(f,m,n,k); {Считываем данные }
s1: = 0; s2: = 0; {Обнуляем затраты}
et := 1; {задаем начальный этаж}
{В цикле определяем куда можно максимально подняться на лифте}
Repeat
et:=et+k;
until et>n;
s1: = (et - n) * 100; {Сколько заплатить, если поднялись выше}
s2: = (n + k - et) * 200; {Сколько заплатить, если поднялись ниже}
{Выбираем и выводим наименьшую сумму}
if s1 < s2 then
write(f1, s1)
else
write(f1, s2);
{Закрываем файлы}
close(f);
close(f1);
end.
{Закрываем файлы}
close(f);
close(f1);
end.
Комментариев нет:
Отправить комментарий