26.04 Прочие прототипы
Ошибка.
Попробуйте повторить позже
У Креветкоеда большая коллекция креветок разных размеров. Каждая креветка имеет размер равный целому числу от
до
(не более
) включительно. У него есть
(каждое не более
) креветок размера
. Две креветки
могут образовать пару, если абсолютное значение разности их размеров составляет не более
. Креветкоед
хочет создать максимальное количество пар из своих креветок при условии, что ни одна креветка не должна
использоваться в нескольких парах. Найдите максимальное количество пар, которые он может создать и
съесть.
В первой строке файла вам дано число
, а в следующих
строках того же файла
целых чисел
Во-первых, предположим, что не существует такого , чтобы
. В этом случае мы можем доказать, что ответ всегда
, где
— общее количество креветок.
Доказательство заключается в следующем. Очевидно, что мы не можем сделать больше, чем пары. С другой
стороны, мы можем в явном виде построить
пары следующим алгоритмом: Пусть
— все креветки,
отсортированные в порядке неубывания. Тогда для каждого
:
(в противном случае нет креветки с целым
числом
, что является противоречием). Таким образом, мы можем построить
пары
.
Таким образом, мы можем сделать
пары.
Когда для некоторого
, вы не можете использовать карты с целым числом
, поэтому вы можете разделить
последовательность на
, и для каждой части вы можете решить задачу независимо (ответ — сумма этих независимых
задач).
На самом деле можно даже не делать сплит по . Достаточно лишь посмотреть при рассмотрении креветок размера
,
не осталась ли у вас ровно
креветка размера
. Следовательно, вы можете разделить последовательность
, по
, и для каждой части вычислить половину (с округлением дробной части в меньшую сторону) суммы, и ответом будет
сумма этих чисел. Асимптотика решения
.
Решение на C++
void solve(){ int n; cin >> n; vector<int> a(n); for(int i = 0; i < n; ++i){ cin >> a[i]; } long long ans = 0; ans += a[0] / 2; a[0] -= 2 * ans; for(int i = 1; i < n; ++i){ if(a[i - 1] > 0){ if(a[i] > 0){ --a[i]; ++ans; } } ans += a[i] / 2; a[i] -= a[i] / 2 * 2; } cout << ans << ’\n’; }
Решение на Python
def solve_python(n, a): ans = 0 for i in range(n - 1): ans += a[i] // 2 if a[i] % 2 and a[i + 1] != 0: ans += 1 a[i + 1] -= 1 ans += a[n - 1] // 2 return ans f = open(’26.txt’) n = int(f.readline()) a = [int(i) for i in f] print(solve_python(n, a))
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!