Решение задач повышенной трудности

Разделы: Информатика


Лифт

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

OPEN "a_in.txt" FOR INPUT AS #1 ‘Открываем файлы для чтения и записи

OPEN "a_out.txt" FOR OUTPUT AS #2

INPUT #1, m, n, k ‘Считываем данные

s1 = 0: s2 = 0 ‘Обнуляем затраты

et = 1 ‘задаем начальный этаж

DO ‘В цикле определяем до куда можно подняться на лифте

et = et + k

LOOP UNTIL et > n

s1 = (et - n) * 100 ‘Сколько заплатить, если поднялись выше

s2 = (n + k - et) * 200 ‘Сколько заплатить, если поднялись ниже

IF s1 < s2 THEN PRINT #2, s1 ELSE PRINT #2, s2 ‘Выбираем наименьшую сумму

CLOSE #1 ‘Закрываем файлы

CLOSE #2

Маршрутное такси

В час пик на остановку одновременно подъехали три маршрутных такси, следующие по одному маршруту, в которые тут же набились пассажиры. Водители обнаружили, что количество людей в разных маршрутках разное, и решили пересадить часть пассажиров так, чтобы в каждой маршрутке было поровну пассажиров. Требуется определить, какое наименьшее количество пассажиров придется при этом пересадить.

Формат входных данных

Во входном файле записано три натуральных числа, не превосходящих 100 - количества пассажиров в первой, второй и третьей маршрутках соответственно.

Формат выходных данных

В выходной файл выведите одно число - наименьшее количество пассажиров, которое требуется пересадить. Если это невозможно, выведите слово IMPOSSIBLE (заглавными буквами).

Примеры

b_in.txt b_out.txt
1 2 3 1
99 100 100 IMPOSSIBLE

Решение.

Находим общее количество пассажиров и проверяем, делится ли оно на 3 нацело. Если да – начинаем работать, в противном случае– выдаем сообщение "impossible". Находим среднее значение (sp). Далее определяем разность количества пассажиров в такси со средним значением и упорядочиваем ее по возрастанию (в р1 – точно не хватает, в р2 – лишние). Досаживаем в р1 до среднего (р1=0), уменьшая при этом в р3 и считаем количество пересаженных (Р). Здесь может случиться две ситуации: первая, в р3 еще остались лишние (т.е. в р2 тоже не хватало) мы их добавляем к Р; вторая, р3 >0 (т.е. не хватает), значит оставшиеся пассажиры находятся в р2 и мы их добавляем к пересаженным (Р).

OPEN "b_in.txt" FOR INPUT AS #1OPEN "b_out.txt " FOR OUTPUT AS #2

INPUT #1, m, n, k

s = m + n + k

IF s MOD 3 = 0 THEN

sp = s \ 3

p1 = m - sp: p2 = n - sp: p3 = k - sp

IF p1 > p2 THEN SWAP p1, p2

IF p2 > p3 THEN SWAP p2, p3

IF p1 > p2 THEN SWAP p1, p2

P = 0

DO

p1 = p1 + 1

p3 = p3 - 1

P = P + 1

LOOP UNTIL p1 = 0

IF p3 > 0 THEN P = P + p3 ELSE P = P + p2

PRINT #2, P

ELSE

PRINT #2, "impossible"

END IF

CLOSE #1

CLOSE #2

Электропоезд

Известно, сколько времени электропоезд тратит на проезд между любыми двумя соседними станциями своего маршрута. Известно время отправления с начальной станции. Напишите программу, которая вычислит время отправления электропоезда с каждой станции его маршрута (для последней станции это будет время прибытия - временем стоянки поезда на станциях мы пренебрежем).

Формат входных данных

В первой строке задано время отправления поезда с начальной станции. Время задается в следующем формате: сначала идут две цифры, задающие часы (от 00 до 23), далее идет двоеточие, затем идут две цифры, задающие минуты (от 00 до 59). Пробелы внутри строки, задающей время, не допускаются.

Во второй строке входного файла записано натуральное число N (2?N?1000) - количество станций в маршруте электропоезда (включая начальную и конечную станции). В третьей строке записано N-1 число - первое из этих чисел задает время следования в минутах от начальной станции до второй станции, второе - время от второй станции до третьей и т.д. Каждое из этих чисел натуральное и не превышает 1000.

Формат выходных данных

В выходной файл для каждой станции выведите время прохождения поезда через эту станцию. Время должно быть выведено в том же формате, в каком оно задается во входных данных.

Примеры

c_in.txt c_out.txt
07:00

4

10 5 3

07:00

07:10

07:15

07:18

22:58

5

2 60 43 20

22:58

23:00

00:00

00:43

01:03

OPEN "c_in.txt" FOR INPUT AS #1 ‘Открываем файл для чтения

OPEN "c_out.txt" FOR OUTPUT AS #2 ‘Открываем файл для записи

INPUT #1, v$, n ‘считываем начало движения

PRINT #2, v$ ‘записываем его в файл вывода

th = VAL(MID$(v$, 1, 2)) ‘выделяем часы

mn = VAL(MID$(v$, 4)) ‘выделяем минуты

FOR i = 1 TO n – 1 ‘в цикле считываем время движения до следующей станции

INPUT #1, m

mn = mn + m ‘добавляем его к минутам и если больше 60 переводим в часы и минуты

IF mn >= 60 THEN c = mn \ 60: mn = mn MOD 60: th = th + c

IF th >= 24 THEN th = th MOD 24

mp$ = MID$(STR$(mn), 2) ‘переводим количество минут в строковый вариант, избавляясь от места для знака.

IF LEN(mp$) < 2 THEN mp$ = "0" + mp$ ‘если одна цифра, добавляем нуль

cp$ = MID$(STR$(th), 2) ‘переводим количество часов в строковый вариант, избавляясь от места для знака.

IF LEN(cp$) < 2 THEN cp$ = "0" + cp$ ‘если одна цифра, добавляем нуль

vp$ = cp$ + ":" + mp$ ‘формируем строку для вывода в файл

PRINT #2, vp$ ‘выводим в файл

NEXT

CLOSE #1 ‘закрываем файлы

CLOSE #2

Такси

Наши люди до метро на такси не ездят!

После затянувшегося совещания директор фирмы решил заказать такси, чтобы развезти сотрудников по домам. Он заказал N машин - ровно столько, сколь у него сотрудников. Однако когда они подъехали, оказалось, что у каждого водителя такси свой тариф за 1 километр.

Директор знает, какому сотруднику сколько километров от работы до дома (к сожалению, все сотрудники живут в разных направлениях, поэтому нельзя отправить двух сотрудников на одной машине). Теперь директор хочет определить, какой из сотрудников на каком такси должен поехать домой, чтобы суммарные затраты на такси (а их несет фирма) были минимальны.

Формат входных данных

Сначала во входном файле записано натуральное число N (1?N?1000) - количество сотрудников компании (совпадающее с количеством вызванных машин такси). Далее записано N чисел, задающих расстояния в километрах от работы до домов сотрудников компании (первое число - для первого сотрудника, второе - для второго и т.д.). Все расстояния - положительные целые числа, не превышающие 1000. Далее записано еще N чисел - тарифы за проезд одного километра в такси (первое число - в первой машине такси, второе - во второй и т.д.). Тарифы выражаются положительными целыми числами, не превышающими 10000.

Формат выходных данных

В выходной файл выведите N чисел. Первое число - номер такси, в которое должен сесть первый сотрудник, второе число - номер такси, в которое должен сесть второй и т.д., чтобы суммарные затраты на такси были минимальны. Если вариантов рассадки сотрудников, при которых затраты минимальны, несколько, выведите любой из них.

Примеры

d_in.txt d_out.txt
3

10 20 30

50 20 30

1 3 2
5

10 20 1 30 30

3 3 3 2 3

1 2 3 5 4

CLS

OPEN "d_in.txt" FOR INPUT AS #1

OPEN "d_out.txt" FOR OUTPUT AS #2

INPUT #1, n

DIM p(2, n), t(2, n)

FOR i = 1 TO n

INPUT #1, p(2, i)

p(1, i) = i

NEXT

FOR i = 1 TO n

INPUT #1, t(2, i)

t(1, i) = i

NEXT

'отсортируем массивы

'pасстояние поубыванию

FOR i = 1 TO n - 1

ma = p(2, i): mma = i

FOR j = i + 1 TO n

IF ma < p(2, j) THEN

mma = j

ma = p(2, j)

END IF

NEXT

SWAP p(1, i), p(1, mma)

SWAP p(2, i), p(2, mma)

NEXT

'тарифы по возрастанию

FOR i = 1 TO n - 1

mi = t(2, i): mmi = i

FOR j = i + 1 TO n

IF mi > t(2, j) THEN

mmi = j

mi = t(2, j)

END IF

NEXT

SWAP t(1, i), t(1, mmi)

SWAP t(2, i), t(2, mmi)

NEXT

FOR i = 1 TO n

p(2, i) = t(1, i)

NEXT

FOR i = 1 TO n - 1

mi = p(1, i): mmi = i

FOR j = i + 1 TO n

IF mi > p(1, j) THEN

mmi = j

mi = p(1, j)

END IF

NEXT

SWAP p(1, i), p(1, mmi)

SWAP p(2, i), p(2, mmi)

NEXT

FOR i = 1 TO n

PRINT #2, p(2, i);

NEXT

CLOSE #1

CLOSE #2

END