Я пытался написать программу, которая проверяет, есть ли какие-либо два элемента в некотором списке L, сумма которых равна заданному целому числу S, и печатает эти два найденных элемента.Программа выдает сообщение об ошибке «! Ok», когда решение недоступно.
Ввод: в первой строке будет целое число T, представляющее количество тестовых случаев, за которыми следуют 2 строки ввода для каждогоконтрольный пример: в первой строке каждого контрольного примера будет 2 целых числа S и E, где S - ожидаемая сумма, а E - количество элементов в списке.Во второй строке будет E целых чисел, разделенных пробелом.Каждое целое число представляет элемент списка L. Элементы никак не сортируются, а некоторые могут иметь одинаковое значение.В случаях, когда число E равно 0, вторая строка будет пустой.
Все значения для элементов списка L будут находиться в том же диапазоне, что и значение S.
вывод: для каждого тестового случая вывод должен содержать следующие заданные значения: если имеетсяуникальное решение, два элемента x и y (из списка L) должны быть напечатаны, разделенные одним пробелом.Если существует несколько решений, будет напечатана только первая полная пара, которая появляется в списке и дает правильную сумму.Если решения не существует, должно быть напечатано сообщение об ошибке «! OK».
Ограничения и примечания:
1≤T≤1000
-10 ^ 6≤S≤10 ^ 6
0≤E≤2⋅10 ^ 4
Сумма значений E не более 10 ^ 7
Для выполнения этой задачи я попытался использовать хеш-таблицу, поскольку использование массивов может быть проблематичным вэтот случай, учитывая сложность времени выполнения.
Вот мой код:
#include <iostream>
#include <bits/stdc++.h>
#include <set>
using namespace std;
int main()
{
long long int numberElements=0, number;
long long int sum=0, temp;
unordered_set<long long int> s;
bool found=0;
int numberCases;
cin >> numberCases;
for(int c = 1; c<=numberCases; c++)
{
s.clear();
cin >> sum;
found=0;
cin>> numberElements;
if(numberElements==0)
cout << "!OK" <<endl;
else
{
for(long long int i = 0; i< numberElements && found==0; i++)
{
cin >> number;
if (sum==(number+number))
{
if (s.find(number)!=s.end() )
{
cout<<number<<" "<<number<<endl;
found=1;
}
}
else
{
if(s.find(number)==s.end())
s.insert(number);
temp = sum - number;
if (s.find(temp)!=s.end())
{ cout<<temp<<" "<<number<<endl;
found=1;
}
}
}
if (found==0)
cout << "!OK" <<endl;
}
}
return 0;
}
Для следующего ввода:
6
8 4
1 2 4 4
8 4
1 2 7 9
8 4
1 2 8 9
8 4
4 5 3 4
8 4
4 1 1 8
8 4
-1 1 9 8
Ожидаемый результат:
4 4
1 7
!OK
3 5
!OK
-1 9
, тогда как на самом деле мой код выводит:
!OK
1 7
1 8
4 5
!OK
!OK
Я пытался обнаружить источник проблемы в моем коде, который вызывает нежелательный вывод, но пока мои усилия не возросли, нетуспех.
Любая помощь будет принята с благодарностью.