@Elnurhan

Что не так с кодом — флаг RE?

Имеется задача: на вход подаётся файл "input.txt". На первой строке этого файла находится число k, на второй строке дана последовательность чисел, записанных через пробел, числа в дипазоне 0 < n < 99999999. Если в последовательности есть два числа, сумма которых равна k, то в файл "output.txt" записать 1, иначе - 0.
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;


int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  unsigned int k, num, ind=0, mxN=2e6;
  
  unsigned int arr[mxN];
 
  ifstream in("input.txt");
  ofstream out("output.txt");

  in >> k;

  while (in >> num)
  {
    arr[ind] = num;
    ++ind;
  }
  if (!k || !ind) return 0;
  // 2 pointers
  sort(arr, arr+ind);
  int l = 0;
  int r = ind - 1;
  while (l != r)
  {
    if (arr[l] + arr[r] < k) 
    {
      ++l;
    }
    else if (arr[l] + arr[r] > k)
    {
      --r;
    }
    else {
      out << "1";
      out.close();
      return 0;
    }
  }

  out << "0";
  out.close();
  return 0;
}

Написал такое решение. Оно рабочее, но на одном из тестов падает с флагом - RE. С чем это может быть связано?
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ответы на вопрос 1
unsigned int arr[mxN];
Щито? Огромный массив на стеке, да ещё и переменного размера? Это что угодно, но не код, соответствующий стандарту С++. Вектор надо юзать.

Upd: Тут нужно юзать unordered_set. Считать в него числа, потом пройтись по нему и смотреть, есть ли противоположное число.
Ответ написан
Ваш ответ на вопрос

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

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