Ошибка.
Попробуйте повторить позже
У Креветкоеда большая коллекция креветок разных размеров. Каждая креветка имеет размер равный целому числу от до (не более ) включительно. У него есть (каждое не более ) креветок размера . Две креветки могут образовать пару, если абсолютное значение разности их размеров составляет не более . Креветкоед хочет создать максимальное количество пар из своих креветок при условии, что ни одна креветка не должна использоваться в нескольких парах. Найдите максимальное количество пар, которые он может создать и съесть.
В первой строке файла вам дано число , а в следующих строках того же файла целых чисел
Во-первых, предположим, что не существует такого , чтобы . В этом случае мы можем доказать, что ответ всегда , где — общее количество креветок.
Доказательство заключается в следующем. Очевидно, что мы не можем сделать больше, чем пары. С другой стороны, мы можем в явном виде построить пары следующим алгоритмом: Пусть — все креветки, отсортированные в порядке неубывания. Тогда для каждого : (в противном случае нет креветки с целым числом , что является противоречием). Таким образом, мы можем построить пары . Таким образом, мы можем сделать пары.
Когда для некоторого , вы не можете использовать карты с целым числом , поэтому вы можете разделить последовательность на , и для каждой части вы можете решить задачу независимо (ответ — сумма этих независимых задач).
На самом деле можно даже не делать сплит по . Достаточно лишь посмотреть при рассмотрении креветок размера , не осталась ли у вас ровно креветка размера . Следовательно, вы можете разделить последовательность , по , и для каждой части вычислить половину (с округлением дробной части в меньшую сторону) суммы, и ответом будет сумма этих чисел. Асимптотика решения .
Решение на 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
f = open("26.txt") n = int(f.readline()) a = [int(f.readline()) for _ in range(n)] ans = 0 for i in range(n - 1): if a[i] >= a[i + 1]: ans += a[i + 1] a[i] -= a[i + 1] a[i + 1] = 0 ans += a[i] // 2 a[i] = a[i] % 2 else: ans += a[i] a[i + 1] -= a[i] a[i] = 0 ans += a[i + 1] // 2 a[i + 1] = a[i + 1] % 2 print(ans)
Специальные программы
Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!
Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.
Бесплатное обучение
в Школково
Для детей ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Брянской областей, а также школьникам, находящимся в пунктах временного размещения Крыма обучение на платформе бесплатное.
Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».
Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ или олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!
Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!