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%!
Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.
Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.
Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».
Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!
Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!