Задача Сириус. Суть задачи такова:
В массиве, заполненном произвольными целыми числами, найдите два числа, произведение которых максимально. Вложенные циклы не используйте.
На вход программе сначала подаётся значение n⩽50000
— количество элементов в массиве. В следующей строке входных данных расположены сами элементы массива — целые числа, по модулю не превосходящие 30000.
Выдайте два искомых числа в порядке неубывания.
примеры:
ввод:
5
-5 3 -4 2 5
вывод:
-5 -4
Написала код, проверила на примере и еще на нескольких подобных тестах, всё прекрасно работало. Отправила код в тестировщик для проверки, пришел ответ, что программа выдает ошибку, хотя только что тот же самый тест выдавал правильный ответ, поэтому я не могу понять: проблема в моем коде или в самом тестировщике, и если в коде, то что не так? код:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n, maxi, mini, now, k, x;
cin >> n;
if (n > 1){
vector <int> maxcnt(2), v(n);
for ( int i = 0; i < n; i++){ // заполнение основного вектора, одновременно поиск минимума и максимума, чтобы уменьшить кол-во строк
cin >> now;
v[i] = now;
if (now > maxi){
maxi = now;
x = i;
}
if (now < mini) {
mini = now;
k = i;
}
}
int maxcnt2 = -30001; // подбор такого значения, чтобы любое первое произведение чисел подошло
for (int i = 0; i < x; ++i){ // поиск наибольшего возможного произведения числа из вектора с максимумом
if (v[i] * maxi >= maxcnt2){
maxcnt[0] = v[i];
maxcnt[1] = maxi;
maxcnt2 = v[i] * maxi;
}
}
for (int i = x + 1; i < n; ++i){
if (v[i] * maxi >= maxcnt2){
maxcnt[0] = v[i];
maxcnt[1] = maxi;
maxcnt2 = v[i] * maxi;
}
}
for (int i = 0; i < k; ++i){ // если оказалось, что произведение какого-либа числа с минимумом оказалось больше (к примеру, два отрицательных числа в векторе дают большее произведение, чем два положительных) то осуществление поиска наибольшего произведения числа из вектора с минимумом
if (v[i] * mini >= maxcnt[0] * maxcnt[1]){
maxcnt[0] = mini;
maxcnt[1] = v[i];
maxcnt2 = v[i] * maxi;
}
}
for (int i = k + 1; i < n; ++i){
if (v[i] * mini >= maxcnt[0] * maxcnt[1]){
maxcnt[0] = mini;
maxcnt[1] = v[i];
maxcnt2 = v[i] * maxi;
}
}
for (int i = 0; i < 2; i++){ // вывод ответа на задачу
cout << maxcnt[i] << " ";
}
}
return 0;
}
Примечание: можно использовать только операции целочисленной арифметики, операторы присваивания, условные конструкции, циклы while и for, операции ввода-вывода и контейнер vector.