— размер массива
— массив чисел
Это игра минимакс: Алиса хочет минимизировать конечный счет, Боб хочет максимизировать его. Оба играют оптимально, и Алиса ходит первой.
Напомним, что арифметическое среднее использует целочисленное деление: .
С только элементами Алиса удаляет один, а Боб удаляет другой, оставляя один элемент в качестве конечного счета. У Алисы всего варианта выбора и оставшихся варианта для Боба — мы можем проверить все возможностей с помощью условных операторов.
Временная сложность:
Пространственная сложность:
Если все значения равны некоторой константе , то арифметическое среднее равно до удаления и после удаления. Счет никогда не меняется, поэтому ответ всегда .
Временная сложность:
Пространственная сложность:
Мы перебираем минимакс. Для каждого возможного выбора , который Алиса может удалить, мы моделируем оптимальный ответ Боба: Боб выберет элемент (), который максимизирует конечный счет . Это означает, что Боб удалит наименьший оставшийся элемент (так как удаление меньшего значения сохраняет сумму больше).
Для каждого выбора Алисы мы вычисляем, что лучшее может достичь Боб. Алиса выберет , который минимизирует это значение. Затем мы сравниваем результат с начальным счетом.
Временная сложность:
Пространственная сложность:
Алиса хочет максимально уменьшить конечный счет, поэтому ее оптимальная стратегия — удалить наибольший элемент — это максимально уменьшает сумму. Боб хочет сохранить конечный счет как можно выше, поэтому его оптимальная стратегия — удалить наименьший оставшийся элемент — это максимально сохраняет сумму.
Алгоритм:
Временная сложность:
Пространственная сложность:
Ничья#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;
}