Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#1 2020-11-11 15:40:38

GeniusDP
Олімпієць
Зареєстрований: 2020-10-15
Повідомлень: 18

Решение Задачи Minandmax

Код:

#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)

Поза форумом

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt