electicode
ГлавнаяКурсыРесурсыЗадачиНациональная олимпиадаСоревнованияТаблица лидеров
...
Задачи/Игровая арифметика/Разбор

Разбор: Игровая арифметика

nnn — размер массива aaa

aaa — массив чисел

Это игра минимакс: Алиса хочет минимизировать конечный счет, Боб хочет максимизировать его. Оба играют оптимально, и Алиса ходит первой.

Напомним, что арифметическое среднее использует целочисленное деление: ⌊S/n⌋\lfloor S / n \rfloor⌊S/n⌋.

Подзадача 1: n=3n = 3n=3 (202020 баллов)

С только 333 элементами Алиса удаляет один, а Боб удаляет другой, оставляя один элемент в качестве конечного счета. У Алисы всего 333 варианта выбора и 222 оставшихся варианта для Боба — мы можем проверить все 666 возможностей с помощью условных операторов.

Временная сложность: O(1)O(1)O(1)
Пространственная сложность: O(1)O(1)O(1)

Подзадача 2: Все aia_iai​ одинаковы (151515 баллов)

Если все значения равны некоторой константе ccc, то арифметическое среднее равно ⌊nc/n⌋=c\lfloor nc / n \rfloor = c⌊nc/n⌋=c до удаления и ⌊(n−2)c/(n−2)⌋=c\lfloor (n-2)c / (n-2) \rfloor = c⌊(n−2)c/(n−2)⌋= после удаления. Счет никогда не меняется, поэтому ответ всегда .

Временная сложность: O(n)O(n)O(n)
Пространственная сложность: O(n)O(n)O(n)

Подзадача 3: n≤103n \leq 10^3n≤103 (252525 баллов)

Мы перебираем минимакс. Для каждого возможного выбора aia_iai​, который Алиса может удалить, мы моделируем оптимальный ответ Боба: Боб выберет элемент aja_jaj​ (j≠ij \neq ij=i), который максимизирует конечный счет . Это означает, что Боб удалит наименьший оставшийся элемент (так как удаление меньшего значения сохраняет сумму больше).

Для каждого выбора Алисы aia_iai​ мы вычисляем, что лучшее может достичь Боб. Алиса выберет aia_iai​, который минимизирует это значение. Затем мы сравниваем результат с начальным счетом.

Временная сложность: O(n2)O(n^2)O(n2)
Пространственная сложность: O(n)O(n)O(n)

Подзадача 4: Полное решение (404040 баллов)

Алиса хочет максимально уменьшить конечный счет, поэтому ее оптимальная стратегия — удалить наибольший элемент — это максимально уменьшает сумму. Боб хочет сохранить конечный счет как можно выше, поэтому его оптимальная стратегия — удалить наименьший оставшийся элемент — это максимально сохраняет сумму.

Алгоритм:

  1. Отсортируйте массив aaa.
  2. Вычислите начальный счет: initial=⌊S/n⌋\text{initial} = \lfloor S / n \rfloorinitial=⌊S/n⌋, где S=∑aiS = \sum a_iS=∑ai​.
  3. Удалите a[ n− (наибольший, выбор Алисы) и (наименьший, выбор Боба).

Временная сложность: O(n)O(n)O(n)
Пространственная сложность: O(n)O(n)O(n)

Код решения

← Вернуться к задаче
c
Ничья
⌊(S−ai−aj)/(n−2)⌋\lfloor (S - a_i - a_j) / (n - 2) \rfloor⌊(S−ai​−aj​)/(n−2)⌋
1 ]a[\,n-1\,]
a[n−1]
a[ 0 ]a[\,0\,]a[0]
  • Вычислите конечный счет: final=⌊(S−a[0]−a[n−1])/(n−2)⌋\text{final} = \lfloor (S - a[0] - a[n-1]) / (n - 2) \rfloorfinal=⌊(S−a[0]−a[n−1])/(n−2)⌋.
  • Сравните и выведите результат.
  • #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
    
        vector<long long> a(n);
        for (int i = 0; i < n; i++)
            cin >> a[i];
    
        sort(a.begin(), a.end());
    
        long long sumAll = 0;
        for (int i = 0; i < n; i++)
            sumAll += a[i];
    
        long long initial = sumAll / n;
        long long final_score = (sumAll - a[0] - a[n - 1]) / (n - 2);
    
        if (final_score < initial)
            cout << "Alice" << endl;
        else if (final_score == initial)
            cout << "Tie" << endl;
        else
            cout << "Bob" << endl;
    
        return 0;
    }