Алиса и боб стали победителями телевикторины, и теперь им предстоит выбрать себе призы. на выбор предлагается n призов, пронумерованных от 1 до n.
распределение призов происходит следующим образом. организаторы телевикторины сообщают победителям целое положительное число k (1 ≤ k ≤ n / 3). сначала алиса выбирает себе любые k подряд идущих номеров призов. потом боб выбирает себе k подряд идущих номеров призов, при этом он не может выбирать номера, которые уже выбрала алиса. после этого победители забирают выбранные ими призы.
алиса хорошо знает боба, и для каждого приза выяснила его ценность для боба, которая является целым положительным числом. алиса обижена на боба и хочет выбрать свои призы так, чтобы суммарная ценность призов, которые достанутся бобу, была как можно меньше. при этом алису не волнует, какие призы достанутся ей.

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

формат входного файла
первая строка входного файла содержит два целых числа: n — общее количество призов и k — количество подряд идущих номеров призов, которое должен выбрать каждый из победителей (3 ≤ n ≤ 100 000, 1 ≤ k ≤ n / 3). вторая строка содержит n целых положительных чисел: a1, a2, …, an. для каждого приза указана его ценность для боба (1 ≤ ai ≤ 109 ).

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

пример
ввод:
10 2
1 2 4 5 2 4 2 2 1 6
вывод:
7
на питоне

VladDzundza VladDzundza    1   09.11.2019 00:26    157

Ответы
GangstaPro GangstaPro  25.12.2023 22:53
Добрый день! Давайте рассмотрим решение данной задачи.

Первым делом, нам нужно получить входные данные из строки и преобразовать их в числа. Это можно сделать с помощью функции split() и map(), которая разделит строку на отдельные элементы, а затем преобразует каждый элемент в число.

Вот код для этого:

```
n, k = map(int, input().split())
prizes = list(map(int, input().split()))
```

После этого, у нас есть общее количество призов `n`, количество подряд идущих номеров призов `k` и список ценностей призов `prizes`.

Далее можно перейти к решению самой задачи. Основная идея заключается в следующем:

1. Алиса будет выбирать первые `k` подряд идущих призов.

2. Боб будет выбирать следующие `k` подряд идущих призов, но только из тех, которые еще не выбрала Алиса.

3. Наша задача - найти минимальное значение `x`, для которого суммарная ценность призов, выбранных Бобом, не превышает `x`.

Давайте разберемся, как решить эту задачу:

1. Создаем список `prefix_sum`, в котором будем хранить префиксные суммы ценностей призов.

```
prefix_sum = [0]*(n+1)
for i in range(1, n+1):
prefix_sum[i] = prefix_sum[i-1] + prizes[i-1]
```

2. Создаем переменную `answer` и присваиваем ей максимально возможное значение суммы ценностей призов.

```
answer = 0
for i in range(k, n+1):
answer = max(answer, prefix_sum[i] - prefix_sum[i-k])
```

3. Выводим значение `answer` как ответ на задачу.

```
print(answer)
```

Вот полный код решения:

```
n, k = map(int, input().split())
prizes = list(map(int, input().split()))

prefix_sum = [0]*(n+1)
for i in range(1, n+1):
prefix_sum[i] = prefix_sum[i-1] + prizes[i-1]

answer = 0
for i in range(k, n+1):
answer = max(answer, prefix_sum[i] - prefix_sum[i-k])

print(answer)
```

Надеюсь, это подробное решение поможет вам понять, как решить данную задачу! Если у вас есть еще вопросы, не стесняйтесь задавать.
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика