27.01 Передвижение по магистрали
Ошибка.
Попробуйте повторить позже
У медицинской компании есть пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах вместимостью пробирок. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории. Компания планирует открыть лабораторию в одном из пунктов. Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна. Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные:
Даны два входных файла — и , каждый из которых содержит в первой строке число () – количество пунктов приёма биоматериалов, и число () – вместимость транспортировочного контейнера. Каждая из следующих строк содержит два натуральных числа: номер пункта и количество пробирок (не превышающее 10000). Пункты перечислены в произвольном порядке.
Пример входного файла:
6 96
5 4
7 3
1 100
10 190
2 200
8 2
При таких исходных данных (вместимость транспортировочного контейнера равна 96 пробирок) компании выгодно открыть лабораторию в пункте 2. В том случае сумма транспортных затрат составит . Ответ: 32.
Неэффективное решение
f = open(’27_A.txt’) n, v = map(int, f.readline().split()) a = [] for i in range(n): s, k = map(int, f.readline().split()) # кол-во сумок if k % v == 0: c = k//v else: c = k//v + 1 a.append([s, c]) a.sort() min_sum = 10**20 for i in range(n): new_sum = 0 for j in range(n): new_sum += abs(a[i][0]-a[j][0])*a[j][1] min_sum = min(min_sum, new_sum) print(min_sum)
Эффективное решение
f = open(’27_B.txt’) n, v = map(int, f.readline().split()) a = [] for i in range(n): s, k = map(int, f.readline().split()) # Считаем кол-во контейнеров if k % v == 0: c = k // v else: c = k // v + 1 a.append([s, c]) a.sort() # Стоимость доставки в нулевом пункте s = 0 for j in range(n): s += abs(a[0][0] - a[j][0]) * a[j][1] min_sum = s left_sum = a[0][1] # Сумма пунктов слева, расстояние до которых увеличивается right_sum = sum([x[1] for x in a]) - left_sum # Сумма пунктов справа, расстояние до которых уменьшается for i in range(1, n): diff = a[i][0] - a[i - 1][0] # Расстояние между двумя пунктами # Пересчет суммы: # для предыдущих пунктов дороже, для следующих дешевле s = s + diff * left_sum - diff * right_sum # Пересчет минимума min_sum = min(min_sum, s) left_sum += a[i][1] right_sum -= a[i][1] print(min_sum)
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах вместимостью не более 26 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные
Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число N – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
Типовой пример организации данных во входном файле
6
1 100
2 200
5 4
7 3
8 2
10 190
При таких исходных данных и вместимости транспортировочного контейнера, составляющей 96 пробирок, компании выгодно открыть лабораторию в пункте 2. В этом случае сумма транспортных затрат составит:.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.
Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.
Решение А
f = open(’27A__1udcp.txt’) n = int(f.readline()) a = [] for i in range(n): km, prob = map(int,f.readline().split())#считываем количество километров и количество пробирок count_conteiner = prob//26 if prob % 26 == 0 else prob//26 + 1 #выделяем количество контейнеров, # если количество пробирок не делится нацело на 26, то берем один контейнер дополнительно a += [[km,count_conteiner]]#добавляем эти данные в список mn = float(’inf’) for i in range(n):# i индекс - место лаборатории s = 0 for j in range(n):# j индекс - место пункта s += abs(a[i][0]-a[j][0])*a[j][1]#расстояние считается как произведение расстояния между пунктами на количество пробирок в пункте mn = min(mn,s) print(mn)
Решение Б
f = open(’27B__1udcq.txt’) n = int(f.readline()) a = [] sm = 0#суммарное кол-во контейнеров for i in range(n): km, prob = map(int,f.readline().split())#считываем количество километров и количество пробирок count_conteiner = prob//26 if prob % 26 == 0 else prob//26 + 1 #выделяем количество контейнеров, # если количество пробирок не делится нацело на 26, то берем один контейнер дополнительно sm += count_conteiner a += [[km,count_conteiner]]#добавляем эти данные в список s = 0 for i in range(n):# в данном цикле высчитывается стоимость для лаборатории, котора стоит на 0 индексе s += (a[i][0]-a[0][0]) * a[i][1] mn = s expsv = 0# число контейнеров, для которых стоимость вырастет for i in range(1,n): expsv += a[i-1][1]#высчитываем кол-во контейнеров, для которых стоимость вырастет при смене места лаборатории r = a[i][0] - a[i-1][0]# разность в км между двумя соседними пунктами s = s + r*expsv - r*(sm - expsv)# формируем стоимость для лаборатории стоящей, на i-ом индексе. # На r*expsv станет дороже стоимость, поскольку относительно магистрали мы сдвинули лабораторию правее и всё, что было левее - стало дороже, # но всё, что было правее лаборатории стало дешевле на r*(sm - expsv) mn = min(mn,s) print(mn)
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 41 штуки. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
f = open(’27B.txt’) # Открываем нужный файл n = int(f.readline()) points = [] all_count = 0 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = list(map(int, f.readline().split())) # Считаем количество контейнеров cnt = (cnt // 41) + int(cnt % 41 != 0) all_count += cnt points.append([num, cnt]) # Полная стоимость относительно пункта по индексу 0 sm = 0 for i in range(n): # Умножаем кол-во контейнеров пункта по индексу i на расстояние до пункта по индексу 0 sm += (points[i][0] - points[0][0]) * points[i][1] left_count = 0 min_cost = sm for i in range(1, n): # При перемещении на пункт вправее к сумме контейнеров прошлых пункта # добавляется контейнеры пункта points[i - 1] left_count += points[i - 1][1] # Считаем изменение расстояния r = points[i][0] - points[i - 1][0] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой sm = sm + left_count * r - (all_count - left_count) * r min_cost = min(min_cost, sm) print(min_cost)
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 73 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Компания наняла менеджера, который должен был рассчитать, в каком пункте наиболее выгодно расположить лабораторию - так, чтобы стоимость перевозки за день была минимальна. Но менеджер что-то перепутал и посчитал наоборот самый невыгодный пункт и стоимость получилась максимальной.
Определите, сколько теряет компания из-за менеджера каждый день. Найдите разницу между суммой, что посчитал менеджер и минимальной общей стоимостью доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Функция для вычисления количества контейнеров в пункте # Если кол-во пробирок не делится нацело - нужно взять ещё один контейнер def count(x, k): return x // k + int(x % k != 0) f = open(’27B_16_02.txt’) k = 73 n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = list(map(int, f.readline().split())) # Вставляем на нужную отметку кол-во контейнеров points[num] = count(cnt, k) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [] if points[0] > 0: costs.append(sm) for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(max(costs) - min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов.
Благодаря развитию нанотехнологий и изобретению телепортов компания, расположив в каждом пункте по одному устройству телепортации, может отправлять некоторое количество пробирок напрямую в лабораторию абсолютно бесплатно. Но так как телепортация - новая технология, пока что ещё запускать телепорты можно только раз в день, и перемещать они могут только простое число пробирок.
Поэтому компания решила телепортировать из каждого пункта максимально возможное число пробирок, а остальные поштучно доставлять в лабораторию по автомагистрали.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество пробирок. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Функция для определения простых чисел def simple(x): if x <= 1: return False for i in range(2, int(x ** 0.5) + 1): if x % i == 0: return False return True # Нахождение всех простых чисел до 1000, # так как количество пробирок не превышает это число nums = [0] for i in range(1000): if simple(i): nums.append(i) # Поиск максимального простого числа, которое можно забрать из пробирок def count(x): return x - max(i for i in nums if i <= x) f = open(’27B_16_03.txt’) n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = list(map(int, f.readline().split())) # Вставляем на нужную отметку кол-во контейнеров points[num] = count(cnt) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [] if points[0] > 0: costs.append(sm) for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 38 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A from math import ceil f = open(’1_27A.txt’) k = 38 n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) # Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil points.append([dist, ceil(cnt / k)]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров sm += abs(dist - cur_d) * cnt costs.append(sm) print(min(costs)) # Файлик B from math import ceil f = open(’1_27B.txt’) k = 38 n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во контейнеров points[num] = ceil(cnt / k) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 500 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Компания наняла менеджера, который должен был рассчитать, в каком пункте наиболее выгодно расположить лабораторию - так, чтобы стоимость перевозки за день была минимальна. Но менеджер что-то перепутал и посчитал наоборот самый невыгодный пункт и стоимость получилась максимальной.
Определите, какую сумму посчитал менеджер. Найдите максимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A from math import ceil f = open(’2_27A.txt’) k = 500 n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) # Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil points.append([dist, ceil(cnt / k)]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров sm += abs(dist - cur_d) * cnt costs.append(sm) print(max(costs)) # Файлик B from math import ceil f = open(’2_27B.txt’) k = 500 n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во контейнеров points[num] = ceil(cnt / k) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(max(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 111 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Компания наняла менеджера, который должен был рассчитать, в каком пункте наиболее выгодно расположить лабораторию - так, чтобы стоимость перевозки за день была минимальна. Но менеджер что-то перепутал и посчитал наоборот самый невыгодный пункт и стоимость получилась максимальной.
Определите, сколько теряет компания из-за менеджера каждый день. Найдите разницу между суммой, что посчитал менеджер и минимальной общей стоимостью доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A from math import ceil f = open(’3_27A.txt’) k = 111 n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) # Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil points.append([dist, ceil(cnt / k)]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров sm += abs(dist - cur_d) * cnt costs.append(sm) print(max(costs) - min(costs)) # Файлик B from math import ceil f = open(’3_27B.txt’) k = 111 n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во контейнеров points[num] = ceil(cnt / k) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(max(costs) - min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов.
Благодаря развитию нанотехнологий и изобретению телепортов компания, расположив в каждом пункте по одному устройству телепортации, может отправлять некоторое количество пробирок напрямую в лабораторию абсолютно бесплатно. Но так как телепортация - новая технология, пока что ещё запускать телепорты можно только раз в день, и перемещать они могут только число пробирок, являющееся членами последовательности Фибоначчи.
Поэтому компания решила телепортировать из каждого пункта максимально возможное число пробирок, а остальные поштучно доставлять в лабораторию по автомагистрали.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество пробирок. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A # Функция, которая вычитает максимальное подходящее число фибоначчи из числа пробирок def fib(x): mx = max([i for i in fibs if x >= i]) return x - mx # Сначала необходимо сгенерировать числа фибоначчи до 1000 fibs = [0, 1, 1] while fibs[-1] <= 1000: fibs.append(fibs[-2] + fibs[-1]) f = open(’4_27A.txt’) n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) # С поиощью нашей функции fib находим остаток нетелепортированных пробирок points.append([dist, fib(cnt)]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров sm += abs(dist - cur_d) * cnt costs.append(sm) print(min(costs)) # Файлик B # Функция, которая вычитает максимальное подходящее число фибоначчи из числа пробирок def fib(x): mx = max([i for i in fibs if x >= i]) return x - mx # Сначала необходимо сгенерировать числа фибоначчи до 1000 fibs = [0, 1, 1] while fibs[-1] <= 1000: fibs.append(fibs[-2] + fibs[-1]) f = open(’4_27B.txt’) n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во контейнеров # С поиощью нашей функции fib находим остаток нетелепортированных пробирок points[num] = fib(cnt) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов.
Благодаря развитию нанотехнологий и изобретению телепортов компания, расположив в каждом пункте по одному устройству телепортации, может отправлять некоторое количество пробирок напрямую в лабораторию абсолютно бесплатно. Но так как телепортация - новая технология, пока что ещё запускать телепорты можно только раз в день, и перемещать они могут только число пробирок, являющееся факториалами натуральных чисел.
Поэтому компания решила телепортировать из каждого пункта максимально возможное число пробирок, а остальные поштучно доставлять в лабораторию по автомагистрали.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество пробирок. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A # Функция, которая вычитает максимальный подходящий факториал из числа пробирок def fact(x): mx = max([i for i in facts if x >= i]) return x - mx # Сначала необходимо сгенерировать факториалы до 1000 facts = [0, 1] k = 2 while facts[-1] <= 1000: facts.append(facts[-1] * k) k += 1 f = open(’5_27A.txt’) n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) # С поиощью нашей функции fib находим остаток нетелепортированных пробирок points.append([dist, fact(cnt)]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров sm += abs(dist - cur_d) * cnt costs.append(sm) print(min(costs)) # Файлик B # Функция, которая вычитает максимальный подходящий факториал из числа пробирок def fact(x): mx = max([i for i in facts if x >= i]) return x - mx # Сначала необходимо сгенерировать факториалы до 1000 facts = [0, 1] k = 2 while facts[-1] <= 1000: facts.append(facts[-1] * k) k += 1 f = open(’5_27B.txt’) n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во контейнеров # С поиощью нашей функции fib находим остаток нетелепортированных пробирок points[num] = fact(cnt) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 300 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна. При этом в пункте, в котором располагают лабораторию, количество пробирок должно быть больше 900.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A from math import ceil f = open(’6_27A.txt’) k = 300 m = 900 n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) points.append([dist, cnt]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров # Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil sm += abs(dist - cur_d) * ceil(cnt / k) if cur_c > m: costs.append(sm) print(min(costs)) # Файлик B from math import ceil f = open(’6_27B.txt’) k = 300 m = 900 n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во пробирок points[num] = cnt # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += ceil(points[i] / k) * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum([ceil(i / k) for i in points]) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += ceil(points[i - 1] / k) right -= ceil(points[i - 1] / k) # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > m: costs.append(current_cost) print(min(costs))
Ошибка.
Попробуйте повторить позже
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 289 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите, насколько изменится минимальную общая стоимость доставки биоматериалов из всех пунктов приёма в лабораторию, если сменить контейнеры на такие, что их обьем не превышает 451.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
Чтобы найти разницу между моделями с разными по объёму контейнерами, запустим программы сначала с k=289, а потом с k=451 и вычтем из первого результата второй. Для файла А получим: 348015 - 254631 = 93384 Для файла В получим: 339199669208 - 246528140589 = 92671528619 Эти числа и запишем в ответ.
# Файлик A from math import ceil f = open(’7_27A.txt’) # k = 289 k = 451 n = int(f.readline()) points = [] for i in f: dist, cnt = map(int, i.split()) # Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil points.append([dist, ceil(cnt / k)]) costs = [] for cur_d, cur_c in points: # Перебираем пункты, где можем поставить лабораторию sm = 0 for dist, cnt in points: # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров sm += abs(dist - cur_d) * cnt costs.append(sm) print(min(costs)) # Файлик B from math import ceil f = open(’7_27B.txt’) # k = 289 k = 451 n = int(f.readline()) # Список, в котором индекс - расстояние от нулевой отметки до этого пункта # элементы - количества контейнеров # Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет # влиять на сумму points = [0] * 10 ** 7 # Индексы первого и последнего реального пункта start = 10 ** 10 end = -1 for i in range(n): # Считываем номер пункта и количество пробирок num, cnt = map(int, f.readline().split()) # Вставляем на нужную отметку кол-во контейнеров points[num] = ceil(cnt / k) # Определяем крайние пункты if cnt > 0: start = min(start, num) end = max(end, num) # Удаляем нулевые пункты по краям points = points[start: end + 1] # Изначальная сумма для 0-го пункта sm = 0 for i in range(len(points)): # Умножаем кол-во контейнеров на расстояние до 0-го пункта sm += points[i] * i # Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1, # значит общая сумма увеличится на сумму пунктов слева # Расстояние до всех пунктов справа уменьшится на 1, # значит общая сумма уменьшится на сумму пунктов справа # Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо left = 0 # Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо right = sum(points) current_cost = sm # Список сумм для каждого пункта costs = [sm] for i in range(1, len(points)): # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент, # а к левой этот элемент прибавляется left += points[i - 1] right -= points[i - 1] # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой current_cost = current_cost + left - right if points[i] > 0: costs.append(current_cost) print(min(costs))