C/C++

С++. Наибольшее произведение. Помогите пожалуйста

Дано N целых чисел. Требуется выбрать из них три таких числа, произведение которых максимально.

Формат входных данных
Во входном файле записано сначала число N — количество чисел в последовательности (3≤N≤106). Далее записана сама последовательность: N целых чисел, по модулю не превышающих 30000.

Формат выходных данных

В выходной файл выведите три искомых числа в любом порядке. Если существует несколько различных троек чисел, дающих максимальное произведение, то выведите любую из них.

входные данные
9
3 5 1 7 9 0 9 -3 10

9 10 9

выходные данные
3
-5 -30000 -12

-5 -30000 -12
#include <fstream>
#include <vector>
#include <algorithm>

int main() {
    std::fstream file("INPUT.TXT", std::ios::in);
    size_t n;
    file >> n;
    std::vector<short> v;
    v.reserve(n);
    for (size_t i = 0; i < n; ++i) {
        short item;
        file >> item;
        v.emplace_back(item);
    }
    file.close();
    std::sort(v.begin(), v.end());
    const auto p1 = (long long)v[0] * v[1] * v[n - 1];
    const auto p2 = (long long)v[n - 3] * v[n - 2] * v[n - 1];
    file.open("OUTPUT.TXT", std::ios::out);
    if (p1 > p2)
        file << v[0] << ' ' << v[1] << ' ' << v[n - 1];
    else
        file << v[n - 3] << ' ' << v[n - 2] << ' ' << v[n - 1];
    return 0;
}
Антон Мосунов
Антон Мосунов
20 861
Лучший ответ
Сам алгоритм нахождения таких троек несложный, особенно если каждое число можно выбирать трижды. Но при больших N, начиная где-то с тысячи, могут появляться лаги. Однако если N не превышает ста шести, то это всё ерунда! А вот насчёт чтения из файла и запись в файл - это всё дешёвые понты..
max = a[0]*a[0]*a[0];
for (i = 0; i < N; i++) { p=a[i];
for (j = i; j < N; j++) { p *= a[j];
for (k = j; k < N; k++) { p *= a[k];
if (p > max) { A = a[i]; B = a[j]; C = a[k]; } } } }
cout << A << ' ' << B << ' ' << C << endl;
Макс Богатов
Макс Богатов
29 440