На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение





Сообщение: 1
ссылка на сообщение  Отправлено: 12.04.23 19:28. Заголовок: Задача 27 6041


Добрый день возникла проблема с решением 27-ой задачи.
Условие:
На каждом километре кольцевой автодороги с двусторонним движением установлены контейнеры для мусора. Длина кольцевой автодороги равна N километров. Нулевой километр и N-й километр автодороги находятся в одной точке. Известно количество мусора, которое накапливается ежедневно в каждом из контейнеров. Из каждого пункта мусор вывозит отдельный мусоровоз. Стоимость доставки мусора вычисляется как произведение количества мусора на расстояние от пункта до ближайшего центра переработки. На автодороге расположено два центра переработки отходов, каждый в одном из пунктов сбора мусора. Расстояние между центрами переработки одинаково, независимо от направления движения по кольцевой автодороге. Центры переработки расположены таким образом, что общая стоимость доставки мусора из всех пунктов минимальна. Определите минимальную суммарную стоимость доставки мусора из всех пунктов сбора в центры переработки отходов.

Код немнго запутанный, но попытался комментариями оьхяснить свою логику, в итоге сделал следующим образом:
file = open('27-130a.txt') 
n = int(file.readline())
points = [int(i) for i in file]
sum_ = 0
min_sum = 10 ** 10
pluses = minuses = 0
new_sum = 0
for i in range(1, (n - 2) // 4 + 1):
sum_ = sum_ + points[ i] * i + points[-i] * i + points[n // 2 + i] * i + points[n // 2 - i] * i #Считаем сумму для расположения на нулевом и n//2 элементе (диаметрально противоположном)

minuses = minuses + points[ i] + points[n // 2 + i] # изменяем "минусы" - те элементы, стоимость вывоза из котрых при перемещении пунктов сбора уменьшилась
pluses = pluses + points[-i + 1] + points[n // 2 - i + 1] # аналогично с "плюсами"

for k in range(1, n // 4):
minuses = minuses - points[k] + points[n//2+k] # пересчитывем "плюсы" и "минусы" для каждого положения центров
minuses = minuses + points[(n - 2) // 4 + k] + points[n//2+(n-2)//4+k]
pluses = pluses + points[k] + points[n//2+k]
minuses = minuses - points[(n - 2) // 4 + k] - points[n // 2 + (n - 2) // 4 + k]
new_sum = sum_ + pluses - minuses
min_sum = min(min_sum, new_sum)
print(min_sum)


Ответы получаются отдаленно похожие, но все-таки совсем не те: 73776 и 1867315141 вместо 69572 и 1861699580.
Прошу, помогите найти ошибку или продемонстрируйте альтернативное решение.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]







Сообщение: 3
ссылка на сообщение  Отправлено: 15.04.23 14:37. Заголовок: Исправил.


Вот правильное решение.
 
file = open('27-130a.txt')

n = int(file.readline())
points = [int(i) for i in file]

sum_ = 0
min_sum = 10 ** 10
pluses = minuses = 0
new_sum = 0
for i in range(1, (n - 2) // 4 + 1):
sum_ = sum_ + points[ i] * i + points[-i] * i + points[n // 2 + i] * i + points[n // 2 - i] * i

minuses = minuses + points[ i] + points[n // 2 + i]
pluses = pluses + points[-i + 1] + points[n // 2 - i + 1]
print(pluses, minuses, sum_)

for k in range(1, n // 2):
sum_ = sum_ - minuses + pluses
min_sum = min(min_sum, sum_)
minuses = minuses + points[(n-2)//4+k] + points[(n//2 + (n-2)//4+k)%n]
pluses = pluses + points[k] + points[n//2+k]
minuses = minuses - points[k] - points[n//2+k]
pluses = pluses - points[(n-2)//4+k+1] - points[(n//2 + (n-2)//4+k+1)%n]
print(min_sum)


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 130
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет