Даны два массива целых чисел одинаковой длины. Необходимо найти первую пару индексов

495
09 октября 2017, 00:49

Даны два массива целых чисел одинаковой длины A[0..n−1] и B[0..n−1]. Необходимо найти первую пару индексов i0 и j0, i0≤j0, такую что A[i0]+B[j0]=max{A[i]+B[j]}, где 0≤i<n,0≤j<n,i≤j.

Время работы – O(n).

Ограничения:
1≤n≤100000, 0≤A[i]≤100000, 0≤B[i]≤100000

для любого i.

оригинал задания https://stepik.org/lesson/12556/step/3?course=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B-%D0%B8-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&unit=2984

как сделать именно О(n) в данном алгоритме.

#include <iostream>
#include <climits>
#include <cassert>
void read_line(int arr[], int count, int& maxNumber, int& indexOfMax)
{
    for (int i = 0; i < count; i++)
    {
        std::cin >> arr[i];
        if (arr[i] > maxNumber)
        {
            maxNumber  = arr[i];
            indexOfMax = i     ;
        }
    }
}
int main(int argc, char** argv)
{
    unsigned int count = 0;
    std::cin >> count;
#define NDEBUG // в начале файла исходного кода, перед включением заголовочного файла
    assert(count > 0);
    int* arrA = new int[count];
    int* arrB = new int[count];
    int maxA = INT_MIN, maxB = INT_MIN, maxAB = INT_MIN;
    int indexA = -1, indexB = -1;
    read_line(arrA, count, maxA, indexA);
    read_line(arrB, count, maxB, indexB);
    maxA = arrA[0];
    indexA = 0;
    int prevB = arrB[0];
    indexB = 0;
    maxAB = maxA + prevB;
    for (int i = 1; i < count ; i++)
    {
        int currentSum = arrB[i];
        currentSum += (maxA < arrA[i] ? arrA[i] : maxA);
        //std::cout<< currentSum<< " maxA " << maxA<< " indB " << indexB<<"\n";
        if ((maxAB < currentSum) && (arrB[indexB] <= i))
        {
            if ((arrA[i] > maxA))
            {
                maxA = arrA[i];
                indexA = i;
                //indexB = i;
            }
            indexB = i;
            maxAB = currentSum;
        }
    }
    if ((indexA >= 0) || (indexB >= 0))
        std::cout << indexA << " " << indexB;
    delete[] arrA;
    delete[] arrB;
    return 0;
}
READ ALSO
Заменить каждый пятый элемент в векторе на &#39;0&#39; с помощью алгоритмов

Заменить каждый пятый элемент в векторе на '0' с помощью алгоритмов

Есть вектор целых чиселНужно только с помощью стандартных алгоритмов STL заменить каждый пятый элемент на 0

207
Добавить переносы в список value

Добавить переносы в список value

Доброго времени суток, помогите решить задачуСделал скрипт на лендинге который по кнопке отправляет товар к корзину

224
Задержка анимации при при наведенном hover

Задержка анимации при при наведенном hover

Добрый деньНужно сделать анимацию, что бы при наведении на блок поднималась нижняя полоска заливая его фоном

185
Как отменить стиль css для элемента

Как отменить стиль css для элемента

Для ссылки определен стиль, как отменить его только для этого элемента?

363