C/C++

Помогите найти ошибку в коде

Текст задачи:
1. По каналу связи передаются положительные целые числа, не превышающие 1000 – результаты измерений, полученных в

ходе эксперимента (количество измерений N известно заранее, гарантируется, что N > 2). После окончания эксперимента передаётся

контрольное значение – наименьшее число R, удовлетворяющее следующим условиям.

1. R – сумма двух различных переданных элементов последовательности («различные» означает, что нельзя просто удваивать

переданные числа, суммы различных, но равных по величине элементов допускаются).

2. R кратно 3.

3. Если в последовательности нет двух чисел, сумма которых кратна 3, контрольное значение считается равным 1.

В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены.

Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка

программирования, например, Free Pascal 2.6.4), которая будет проверять правильность контрольного значения.

Программа должна напечатать отчёт по следующей форме:

Вычисленное контрольное значение: …

Контроль пройден (или Контроль не пройден)

Код:
#include <iostream>

#include <fstream>

using namespace std;

ifstream v_1("1.txt");

int main()

{

system("chcp 1251 > nul");

int N, min = INT_MAX, r;

cout << "Введите количество чисел: " << endl;

cin >> N;

int* a = new int[N];

for (int i = 0; i < N; i++)

{

v_1 >> a[i];

}

for (int i = 0; i < N; i++)

{

for (int j = i + 1; j < N; j++)

{

if ((a[i] + a[j]) % 3 == 0)

{

if ((a[i] + a[j]) < min) min = a[i] + a[j];

}

}

}

if (min == INT_MAX)

cout << "Вычисленное контрольное значение: 1" << endl << "Контроль не пройден";

else if (min != a[N])

cout << "Вычисленное контрольное значение: " << min << endl << "Контроль не пройден";

else if (min == a[N])

cout << "Вычисленное контрольное значение : " << min << endl << "Контроль пройден";

}

Входные данные:
6
100
8
33
145
19
84
27

P.S.
Все число помимо количества чисел(6) я засунул в текстовый файл.
int* a = new int[N]; // элементы будут с номерами от 0 до N-1
а в конце программы что-то сравниваешь с a[N] - откуда оно возьмётся?
Бакытбек Кайдылдаев
Бакытбек Кайдылдаев
9 861
Лучший ответ
Граф применил чертову математику!
Чтобы пара делилась на три, есть два варианта:
оба числа кратны трем
остаток деления на три одного числа = 1, другого 2.
Поэтому достаточно из всего массива рассовать подходящие по этому критерию числа в две пары (Граф любит троицу поэтому у него три).

PS: но я бы хрен догадался)
 inline int& max(pair& a)
{
return a.first > a.second ? a.first : a.second;
}

inline int sum(pair& a)
{
return a.first + a.second;
}

int find_R(vector vec)
{
pair _3_0 = {50000,50000};
pair _2_1 = {50000,50000};
for (auto& i : vec)
{
switch(i%3)
{
case 0: if (max(_3_0) > i) max(_3_0) = i; break;
case 1: if (_2_1.second > i) _2_1.second = i; break;
case 2: if (_2_1.first > i) _2_1.first = i; break;
}
}
if (sum(_2_1) < sum(_3_0) && sum(_2_1) < 50000) return sum(_2_1);
else if (sum(_3_0) < 50000) return sum(_3_0); else return 1;
}
றÅ¥ ฟỐ╚F_Ῥ .ℱ.
றÅ¥ ฟỐ╚F_Ῥ .ℱ.
51 416
Опять квадрат(
И ты создаешь массив на N элементов, а в конце обращаешься к (N + 1)'ому.

Держи O(N):
 #include 
#include

using namespace std;


int findR(vector &v, int N) {
vector d(3, {1e5, 1e5});
for (int i = 0; i < N; i++) {
if (v[i] < d[v[i] % 3].first) {
d[v[i] % 3].second = d[v[i] % 3].first;
d[v[i] % 3].first = v[i];
} else if (v[i] < d[v[i] % 3].second)
d[v[i] % 3].second = v[i];
}
int res = 1e7;
if(d[0].first < 1e5 && d[0].second < 1e5) res = d[0].first + d[0].second;
if(d[1].first < 1e5 && d[2].first < 1e5) res = min(res, d[1].first + d[2].first);
return (res < 1e7 ? res : 1);
}


int main() {
freopen("input.txt", "r", stdin);
int n;
cin >> n;
vector a(n + 1);
for(auto &i: a)
cin >> i;
int r = findR(a, n);
cout
றÅ¥ ฟỐ╚F_Ῥ .ℱ. Пойду дворником работать...