Поиск по этому блогу

пятница, 10 февраля 2017 г.

Лифт

Предлагается решение олимпиадной задачи одного из этапов Всероссийской олимпиады школьников по информатике. Буду рад, если кому-нибудь из коллег или школьников, материал будет полезен

Задача

Чтобы поднять на 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.

Комментариев нет:

Отправить комментарий