Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 04.03.2023
Сообщений: 5

Максимальное количество монет, которое может получить Евгений

09.04.2023, 15:51. Показов 2896. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Евгений — логист, и у него есть n товаров. За продажу i-го товара компания получит ai монет прибыли (она может быть и отрицательной). В стране, в которой живет Евгений, странные правила выбора товаров для доставки: Евгений может выбрать любой отрезок товаров, но только один, и доставить все товары на этом отрезке (отрезком называется непрерывная последовательность товаров). Для доставки нужны грузовики, в каждый из которых помещается не более k любых товаров, причем за использование каждого грузовика нужно заплатить s монет. Найдите, какое максимальное количество монет может получить Евгений, учитывая затраты на грузовики.



Формат ввода

Первая строка содержит три целых числа n, k и s (1≤n≤105,1≤k≤10,1≤s≤109) — количество товаров, а также числа k и s.
Вторая строка содержит n целых чисел a1,a2,…,an (−109≤ai≤109) — стоимости товаров.

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

Выведите одно число — максимальное количество монет, которое может получить Евгений

Пример 1

Ввод:
6 3 10
0 -4 16 -7 3 8
Вывод:
6

Пример 2

Ввод:
3 2 10
9 9 9
Вывод:
8

Пример 3

Ввод:
5 3 15
3 2 4 5 1
Вывод:
0

Пример 4

Ввод:
10 3 5
-3 9 7 15 -10 9 7 6 -1 0
Вывод:
28

Примечания

В первом примере оптимально будет выбрать только товар со стоимостью 16 и потратить 10 монет на один грузовик.
Во втором примере оптимально выбрать любой отрезок из двух товаров.

В третьем примере не получится доставить ни одного товара так, чтобы получить прибыль.

В четвертом примере оптимально будет выбрать отрезок от второго товара до восьмого.

Я что то попытался сделать, но там с некоторыми примерами не сходится.

не совпадает 2 и 4 примеры.
во 2 примере выходит 0 вместо 8.
в 4 примере выходит 23 вместо 28.
Вообще уже 2 дня сижу над ней.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n, k, s = map(int, input().split())
a = list(map(int, input().split()))
 
dp = [0] * (n+1)
for i in range(1, n+1):
    for j in range(i, max(1, i-k)-1, -1):
        cost = sum(a[j-1:i]) - s * (i-j+1)
        if cost > 0:
            dp[i] = max(dp[i], dp[j-1] + cost)
        else:
            dp[i] = max(dp[i], dp[j-1])
 
print(dp[n])
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2023, 15:51
Ответы с готовыми решениями:

Определить максимальное количество ноутбуков, которое может быть размещено на складе
Всё решил кроме этой задачи, помогите пожалуйста) Складирование ноутбуков На склад, который имеет форму прямоугольного параллелепипеда,...

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

Напишите программу, которая находит наибольшее количество монет, которое может собрать пират, и выводит его маршрут
Прямоугольный остров разделён на квадраты, так что его размеры – N на M квадратов. В каждом квадрате с координатами ( i , j ) (сначала...

18
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 16:24
fhsfdghtfr, почему ты решил, что тут дп?

10 3 5
-3 9 7 15 -10 9 7 6 -1 0

1ая машина (9+7+15-5)=26
2ая машина (-10-5) = -15
3ая машина (9+7+6-5) = 17

итого: 26-15+17 = 28
1
290 / 170 / 92
Регистрация: 21.03.2016
Сообщений: 400
09.04.2023, 16:27
Цитата Сообщение от fhsfdghtfr Посмотреть сообщение
В первом примере оптимально будет выбрать только товар со стоимостью 16 и потратить 10 монет на один грузовик.
по такой логике получается можно взять 16-10 и 3+8-10, что-то в задании не так.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 16:29
Berbentsev, а куда -7 потерялся?
0
290 / 170 / 92
Регистрация: 21.03.2016
Сообщений: 400
09.04.2023, 16:29
Не, не прав. извиняюсь. Отрезок же непрерывный.
1
0 / 0 / 0
Регистрация: 04.03.2023
Сообщений: 5
09.04.2023, 16:30  [ТС]
мы командой решаем, никто ничего не понимает и я тоже, вот решил тут спросить
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 16:34
10 3 5
-3 9 7 15 -10 9 7 6 -1 0

1ая машина (9+7+15-5)=26
2ая машина (-10+9+7-5) = 1
3ая машина (6-5) = 1

итого: 26+1+1 = 28

вот так правильней будет.
1
0 / 0 / 0
Регистрация: 04.03.2023
Сообщений: 5
09.04.2023, 16:40  [ТС]
всё равно ничего не понимаю...
пойду уроки лучше делать)
потом буду думать над задачей, все равно тупой для того чтобы код писать
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 16:48
fhsfdghtfr, вот почитай.
Поиск подотрезка массива с максимальной/минимальной суммой

Добавлено через 1 минуту
только у тебя тут есть еще K и S
1
290 / 170 / 92
Регистрация: 21.03.2016
Сообщений: 400
09.04.2023, 17:01
Лучший ответ Сообщение было отмечено fhsfdghtfr как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
import math
 
n, k, s = map(int, input().split())
a = list(map(int, input().split()))
max_coins = 0
for i in range(n):
    for j in range(i+1, n+1):
        coins = sum(a[i:j]) - math.ceil(len(a[i:j]) / k)*s
        if coins > max_coins:
            max_coins = coins
 
print(max_coins)
2
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 17:14
Berbentsev, это O(n^3), по времени не пройдет.
Цитата Сообщение от Berbentsev Посмотреть сообщение
math.ceil(len(a[i:j]) / k)*s
и эта конструкция "порадовала")
0
0 / 0 / 0
Регистрация: 04.03.2023
Сообщений: 5
09.04.2023, 17:15  [ТС]
тест по времени не проходит, но спасибо!
9 апр 2023, 19:12:44
85472584
C
Python 3.9 (PyPy 7.3.11)
TL
-
1.095s
110.64Mb
12 -
отчёт
0
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 30
09.04.2023, 17:17
Теперь пишет, что лимит времени превышен
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 17:24
можно сократить время до O(n^2) если предварительно подсчитать префикс-суммы.
1
290 / 170 / 92
Регистрация: 21.03.2016
Сообщений: 400
09.04.2023, 17:40
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import math
 
n, k, s = map(int, input().split())
a = list(map(int, input().split()))
max_coins = 0
for i in range(n):
    sum_coins = 0
    for j in range(i+1, n):
        sum_coins += a[j]
        coins = sum_coins - math.ceil((j-i) / k) * s
        if coins > max_coins:
            max_coins = coins
 
print(max_coins)
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
09.04.2023, 17:46
Цитата Сообщение от Berbentsev Посмотреть сообщение
j-i
+1 еще видимо. нет?
0
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 30
09.04.2023, 17:54
Пишет, что неверный ответ
0
290 / 170 / 92
Регистрация: 21.03.2016
Сообщений: 400
09.04.2023, 21:30
Цитата Сообщение от eaa Посмотреть сообщение
+1 еще видимо. нет?
Да вроде нет, j всегда больше i

Добавлено через 3 часа 24 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import math
 
n, k, s = map(int, input().split())
a = list(map(int, input().split()))
max_coins = 0
sum_coins = 0
number = 0
for value in a:
    if value <= 0 and sum_coins == 0:
        continue
    sum_coins += value
    number += 1
    coins = sum_coins - math.ceil(number / k) * s
    if coins <= 0 and number > 1:
        sum_coins = 0
        number = 0
        continue
    if coins >= max_coins:
        max_coins = coins
 
print(max_coins)
Вот еще набросал. Наверное быстрее должно работать.
1
0 / 0 / 0
Регистрация: 04.03.2023
Сообщений: 5
09.04.2023, 22:02  [ТС]
Емаё. На 10 тесте ошибка WA. Спасибо, но ложись спать, поздно.

Добавлено через 4 минуты
Реально. Ты здесь уже 8 часов, устал наверное, иди отдыхать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2023, 22:02
Помогаю со студенческими работами здесь

Определить максимальное суммарное количество пирожков, которое может съесть Ваня
Ваня Пирожков очень любит пирожки с картошкой и с капустой. Один пирожок с картошкой он съедает за N мс, а с капустой – за M мс. У него...

Функция находящая максимальное количество олимпов которое может иметь игрок в конце i-го дня
Нужно реализовать алгоритм на языке программирования c++. Весь алгоритм я вам даю. ui - количество олимпов, за которые можно купить 1...

Определите максимальное количество товара Х, которое может быть произведено при данных условиях
Кривая производственных возможностей задана уравнением: 8х в квадрате + 10у = 800. Определите: 1) максимальное количество товара Х, которое...

Составьте программу, которая вычисляет максимальное количество яблок, которое может собрать ёжик, передвигаясь к нужному квадратику
План прямоугольного сада размером mxn состоит из квадратных зон. В каждой зоне растёт по дереву. С каждого дерева любой зоны могут упасть...

Чему равно максимальное число монет N, которое вы ещё согласились бы заплатить за своё участие в игре?
Представьте себе такую игру. Вы платите N монет, и крупье кидает кубик (в нашем случае пусть будет чёт-нечет на кубике). Если крупье...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru