Тема 26. Программирование - Обработка целочисленной информации с использованием сортировки

26.04 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование - обработка целочисленной информации с использованием сортировки
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#37828

У Креветкоеда большая коллекция креветок разных размеров. Каждая креветка имеет размер равный целому числу от       1  до N  (не более 2 ⋅106  ) включительно. У него есть Ai  (каждое не более 103  ) креветок размера i  . Две креветки могут образовать пару, если абсолютное значение разности их размеров составляет не более 1  . Креветкоед хочет создать максимальное количество пар из своих креветок при условии, что ни одна креветка не должна использоваться в нескольких парах. Найдите максимальное количество пар, которые он может создать и съесть.

В первой строке файла 26.txt вам дано число N  , а в следующих N  строках того же файла N  целых чисел Ai.

Вложения к задаче
Показать ответ и решение

Во-первых, предположим, что не существует такого i  , чтобы Ai = 0  . В этом случае мы можем доказать, что ответ всегда S∕∕2  , где S  — общее количество креветок.

Доказательство заключается в следующем. Очевидно, что мы не можем сделать больше, чем S∕∕2  пары. С другой стороны, мы можем в явном виде построить S∕∕2  пары следующим алгоритмом: Пусть x1,...,xS  — все креветки, отсортированные в порядке неубывания. Тогда для каждого i  : xi+1 − xi ≤ 1  (в противном случае нет креветки с целым числом xi + 1  , что является противоречием). Таким образом, мы можем построить S∕∕2  пары (x1,x2),(x3,x4),...  . Таким образом, мы можем сделать S∕∕2  пары.

Когда Ai = 0  для некоторого i  , вы не можете использовать карты с целым числом i  , поэтому вы можете разделить последовательность на i  , и для каждой части вы можете решить задачу независимо (ответ — сумма этих независимых задач).

На самом деле можно даже не делать сплит по 0  . Достаточно лишь посмотреть при рассмотрении креветок размера        i  , не осталась ли у вас ровно 1  креветка размера i− 1  . Следовательно, вы можете разделить последовательность  Ai  , по 0  , и для каждой части вычислить половину (с округлением дробной части в меньшую сторону) суммы, и ответом будет сумма этих чисел. Асимптотика решения O (N )  .

Решение на 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))

Ответ: 34258187

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

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

Бесплатное онлайн-обучение

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

Налоговые вычеты

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

Специальное предложение
для учителей

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

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!