Задача Доставка
C. Доставка
Ограничение времени 1 секунда
Ограничение памяти 256M
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Евгений — логист, и у него есть 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
Код на Python:
n, k, s = map(int, input().split())
a = list(map(int, input().split()))
max_profit = 0
for i in range(n):
for j in range(i, n):
profit = sum(a[i:j+1])
if profit > 0:
trucks = (j - i + 1 + k - 1) // k
cost = trucks * s
max_profit = max(max_profit, profit - cost)
print(max_profit)
Код на C++:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, k, s;
cin >> n >> k >> s;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
int max_profit = 0;
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
int profit = 0;
for (int l = i; l <= j; l++)
profit += a[l];
if (profit > 0)
{
int trucks = (j - i + 1 + k - 1) / k;
int cost = trucks * s;
max_profit = max(max_profit, profit - cost);
}
}
}
cout << max_profit << endl;
return 0;
}
Задача решена верно, но тут ограничение времени в 1 секунду. И я не понимая как мне ещё можно оптимизировать код на Python. Решил переписать на C++ но вот все результаты:
Кто знает как добиться 1 секунды?