Задать вопрос
@kapi_8888

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

Задача Сириус. Суть задачи такова:
В массиве, заполненном произвольными целыми числами, найдите два числа, произведение которых максимально. Вложенные циклы не используйте.
На вход программе сначала подаётся значение 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.
  • Вопрос задан
  • 29 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас неинициализированные переменные mini и maxi. И они используюся такими в сравнениях. Это Undefined Behavior и на разных компьютерах может вести себя по разному. И если вам не повезет и, например, mini окажется каким-то очень маленьким числом, то у вас выдаст не правильный ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы