Редакция для Максимальный разрыв
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Нужно найти максимальный промежуток между соседними столбами, если расставить их по возрастанию координат.
Самая важная мысль: соседними считаются не столбы во входном порядке, а столбы после сортировки координат.
Значит, задача сводится к двум шагам:
- отсортировать массив координат;
- пройти по нему и найти максимум среди разностей
a[i] - a[i - 1].
2. Наблюдения
- Пока координаты не отсортированы, нельзя понять, какие столбы являются соседними на прямой.
- После сортировки все соседние столбы будут стоять рядом в массиве.
- Тогда каждый промежуток между соседними столбами — это просто разность двух соседних элементов массива.
- Если есть одинаковые координаты, промежуток между ними равен
0. Это нормально и тоже учитывается. - По ограничениям
nдо2 * 10^5, поэтому полный перебор всех пар не подходит. Но сортировка работает достаточно быстро.
Пример:
Координаты: 7 -5 -5
После сортировки: -5 -5 7
Промежутки:
-5 - (-5) = 07 - (-5) = 12
Максимум равен 12.
3. Алгоритм
- Считать
n. - Считать массив координат
a. - Отсортировать
a. - Инициализировать ответ как
a[1] - a[0]. - Для каждого
iот2доn - 1:- вычислить
a[i] - a[i - 1]; - обновить максимум.
- вычислить
- Вывести ответ.
4. Почему это работает
После сортировки координат получаем их порядок на прямой слева направо.
Пусть отсортированный массив равен a[0], a[1], ..., a[n-1].
Тогда:
a[0]иa[1]— соседние столбы,a[1]иa[2]— соседние столбы,- ...
a[n-2]иa[n-1]— соседние столбы.
Других соседних пар нет, потому что между любыми a[i] и a[i+1] не находится ни одной другой координаты.
Значит, все нужные промежутки — это именно разности:
a[1] - a[0]a[2] - a[1]- ...
a[n-1] - a[n-2]
Если взять максимум среди этих значений, то мы и получим самый широкий промежуток между соседними столбами.
Следовательно, алгоритм корректен.
5. Сложность
- Сортировка массива из
nэлементов занимаетO(n log n). - Один проход по массиву для поиска максимума занимает
O(n). - Общая сложность:
O(n log n). - Дополнительная память:
O(1), если не считать память на хранение самого массива.
6. Код на C++17
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
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 ans = a[1] - a[0];
for (int i = 2; i < n; i++) {
ans = max(ans, a[i] - a[i - 1]);
}
cout << ans << "\n";
return 0;
}
7. Код на Python 3
n = int(input())
a = list(map(int, input().split()))
a.sort()
ans = a[1] - a[0]
for i in range(2, n):
ans = max(ans, a[i] - a[i - 1])
print(ans)
Комментарии