На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
#include <bits/stdc++.h> using namespace std; #define INF 1e18//10^18 long long max(long long x, long long y){ return ((x>y)?x:y); } long long min(long long x, long long y){ return ((x<y)?x:y); } int main() { int n; long long minDiff=INF; scanf("%d", &n); vector<int> a(n); for(int i=0; i<n; i++) scanf("%d", &a[i]); for(int i=1; i<n; i++) minDiff=min(minDiff, ( max(a[i], a[i-1])-min(a[i], a[i-1]) )); printf("%d", minDiff); return 0; }
/*
Итак. Идея решения.
Ну для n=2 всё понятно: max(a[0], a[1])-min(a[0], a[1]) - это и будет ответ.
Тогда без ограничения общности экстраполируем частный случай на общий(красиво, правда?)) ): пусть возьмем первые два элемента массива а.
Добавим третий к рассмотрению. Он мог:
-оказаться больше max(a[0], a[1]), тогда он станет максимальным(минимальный не изменится) и тогда его брать не выгодно(ответ станет больше, а нам надо минимальную разность).
-оказаться посередине между max и min. Ну как бы всё равно: ответ не изменился.
- оказаться меньше min(как первый случай, только наоборот).
Вывод: делать отрезки больше, чем в 2 эл-та не выгодно. Рассматриваем только отрезки длины 2. А их мы считать умеем.
ТЫДЫЩЬ - AC!
*/
Відредаговано GeniusDP (2020-11-11 15:50:27)
Поза форумом