Не получается решить олимпиадную задачу

Рейтинг: 0Ответов: 1Опубликовано: 22.03.2023

Садовод Иван сажал семена каждые N дней, в i-ый день Иван посадил ai семечку. Теперь Иван хочет собрать только самую взросшую пару. Взросшая пара семян (i, j) посаженные в i и j дни соответственно, называется самой взросшей, если |ai - aj| максимально среди возможных пар.

Входные данные: В первой строке: N - количество дней Во второй строке: целые числа от a1, a2, a3..., где ai - то, насколько взросло семя

Выходные данные: Номера дней i и j, в которых семена являются самыми взросшими. Числа i и j лежат в диапазоне от 1 до N. Если таких пар несколько - вывести пару с максимальным значением |i - j|. Обратите внимание, что пара i и j отличается от пары j и i.

Например:

Вход:
6
1 2 1 3 1 3

Выход:
6 1
Вход:
4
2 1 0 -1

Выход:
1 4

Я попытался решить эту задачу, но код работает только для второго входа, но не для первого. Вот код, в чем может быть проблема?

int n = int.Parse(Console.ReadLine());
int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

int maxDiff = int.MinValue;
int maxI = 0, maxJ = 0;

for (int i = 0; i < n; i++)
{
    for (int j = 1; j < n; j++)
    {
        int diff = Math.Abs(arr[i] - arr[j]);
        if (diff > maxDiff)
        {
            maxDiff = diff;
            maxI = i;
            maxJ = j;
        }
        else if (diff == maxDiff)
        {
            int dist1 = Math.Abs(maxI - maxJ);
            int dist2 = Math.Abs(i - j);
            if (dist2 > dist1)
            {
                maxI = i;
                maxJ = j;
            }
        }
    }
}

Console.WriteLine($"{maxI + 1} {maxJ + 1}");

Ответы

▲ 2Принят

Я так понимаю, задача сводится к нахождению минимума и максимума в массиве

Пример

(int i, int j) FindMaxDiff(int[] data)
{
    int minLeft = 0;
    int minRight = 0;
    int maxLeft = 0;
    int maxRight = 0;

    for (int i = 0; i < data.Length; i++)
    {
        if (data[i] < data[minLeft]) minLeft = i;
        if (data[i] <= data[minRight]) minRight = i;


        if (data[i] > data[maxLeft]) maxLeft = i;
        if (data[i] >= data[maxRight]) maxRight = i;
    }

    if (Math.Abs(minLeft - maxRight) < Math.Abs(minRight - maxLeft))
        return (minRight + 1, maxLeft + 1);     
    else
        return (minLeft + 1, maxRight + 1);     
}

Проверка

Console.WriteLine(FindMaxDiff(new[] { 1, 2, 1, 3, 1, 3 }).ToString());
Console.WriteLine(FindMaxDiff(new[] { 2, 1, 0, -1 }).ToString());

Вывод

(1, 6)
(4, 1)