Telegram Group & Telegram Channel
🎯 Задача: "Числа-близнецы с кастомным компаратором" (C++ для продвинутых)

У вас есть массив N целых чисел. Нужно найти все пары чисел (A, B), таких что:

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

Ограничения:
- 1 <= N <= 10^5
- -10^9 <= A[i] <= 10^9

Пример:

Вход:

arr = [4, 7, 9, 2, 8, 3]


Вывод:


(2,3)
(4,3)
(4,7)
(8,7)
(8,9)


Минимальная разница = 1

🧠 Уловки задачи:

Наивное сравнение O(N²) слишком медленно

Нужно использовать сортировку + два указателя или бинарный поиск

✍️ Решение:

Идея решения — сначала разделить все числа на четные и нечетные, отсортировать их, а затем с помощью двух указателей найти пары с минимальной разницей. После этого собрать все такие пары и отсортировать результат по условию.

Код:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int main() {
int N;
cin >> N;
vector<int> even, odd;

for (int i = 0; i < N; ++i) {
int x;
cin >> x;
if (x % 2 == 0) even.push_back(x);
else odd.push_back(x);
}

sort(even.begin(), even.end());
sort(odd.begin(), odd.end());

vector<pair<int, int>> result;
int min_diff = INT_MAX;

int i = 0, j = 0;
while (i < even.size() && j < odd.size()) {
int a = even[i];
int b = odd[j];
int diff = abs(a - b);

if (diff < min_diff) {
min_diff = diff;
result.clear();
result.emplace_back(a, b);
} else if (diff == min_diff) {
result.emplace_back(a, b);
}

if (a < b) i++;
else j++;
}

sort(result.begin(), result.end());

for (auto& p : result) {
cout << "(" << p.first << "," << p.second << ")\n";
}

return 0;
}```

🔍 Пошаговый разбор:

Считываем входные данные

Разделяем числа на четные и нечетные

Сортируем оба массива

Используем два указателя, чтобы найти минимальную разницу за O(N)

Если нашли пару с меньшей разницей — сбрасываем результат и добавляем её

Если нашли пару с такой же разницей — просто добавляем

Финально сортируем все найденные пары по A, затем по B

Почему задача хитрая: Нужно оптимальное решение вместо лобового перебора
Включает тонкую работу с индексами
Требует правильно обрабатывать несколько минимальных пар
Объединяет знания сортировки, двух указателей и поиска пар

💪 Challenge для профи: 👉 Попробуйте реализовать эту задачу с помощью multiset + lower_bound / upper_bound, чтобы избежать сортировки массивов и упростить логику поиска ближайших чисел.



tg-me.com/cpluspluc/1064
Create:
Last Update:

🎯 Задача: "Числа-близнецы с кастомным компаратором" (C++ для продвинутых)

У вас есть массив N целых чисел. Нужно найти все пары чисел (A, B), таких что:

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

Ограничения:
- 1 <= N <= 10^5
- -10^9 <= A[i] <= 10^9

Пример:

Вход:


arr = [4, 7, 9, 2, 8, 3]


Вывод:


(2,3)
(4,3)
(4,7)
(8,7)
(8,9)


Минимальная разница = 1

🧠 Уловки задачи:

Наивное сравнение O(N²) слишком медленно

Нужно использовать сортировку + два указателя или бинарный поиск

✍️ Решение:

Идея решения — сначала разделить все числа на четные и нечетные, отсортировать их, а затем с помощью двух указателей найти пары с минимальной разницей. После этого собрать все такие пары и отсортировать результат по условию.

Код:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int main() {
int N;
cin >> N;
vector<int> even, odd;

for (int i = 0; i < N; ++i) {
int x;
cin >> x;
if (x % 2 == 0) even.push_back(x);
else odd.push_back(x);
}

sort(even.begin(), even.end());
sort(odd.begin(), odd.end());

vector<pair<int, int>> result;
int min_diff = INT_MAX;

int i = 0, j = 0;
while (i < even.size() && j < odd.size()) {
int a = even[i];
int b = odd[j];
int diff = abs(a - b);

if (diff < min_diff) {
min_diff = diff;
result.clear();
result.emplace_back(a, b);
} else if (diff == min_diff) {
result.emplace_back(a, b);
}

if (a < b) i++;
else j++;
}

sort(result.begin(), result.end());

for (auto& p : result) {
cout << "(" << p.first << "," << p.second << ")\n";
}

return 0;
}```

🔍 Пошаговый разбор:

Считываем входные данные

Разделяем числа на четные и нечетные

Сортируем оба массива

Используем два указателя, чтобы найти минимальную разницу за O(N)

Если нашли пару с меньшей разницей — сбрасываем результат и добавляем её

Если нашли пару с такой же разницей — просто добавляем

Финально сортируем все найденные пары по A, затем по B

Почему задача хитрая: Нужно оптимальное решение вместо лобового перебора
Включает тонкую работу с индексами
Требует правильно обрабатывать несколько минимальных пар
Объединяет знания сортировки, двух указателей и поиска пар

💪 Challenge для профи: 👉 Попробуйте реализовать эту задачу с помощью multiset + lower_bound / upper_bound, чтобы избежать сортировки массивов и упростить логику поиска ближайших чисел.

BY C++ Academy


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/cpluspluc/1064

View MORE
Open in Telegram


telegram Telegram | DID YOU KNOW?

Date: |

Should You Buy Bitcoin?

In general, many financial experts support their clients’ desire to buy cryptocurrency, but they don’t recommend it unless clients express interest. “The biggest concern for us is if someone wants to invest in crypto and the investment they choose doesn’t do well, and then all of a sudden they can’t send their kids to college,” says Ian Harvey, a certified financial planner (CFP) in New York City. “Then it wasn’t worth the risk.” The speculative nature of cryptocurrency leads some planners to recommend it for clients’ “side” investments. “Some call it a Vegas account,” says Scott Hammel, a CFP in Dallas. “Let’s keep this away from our real long-term perspective, make sure it doesn’t become too large a portion of your portfolio.” In a very real sense, Bitcoin is like a single stock, and advisors wouldn’t recommend putting a sizable part of your portfolio into any one company. At most, planners suggest putting no more than 1% to 10% into Bitcoin if you’re passionate about it. “If it was one stock, you would never allocate any significant portion of your portfolio to it,” Hammel says.

Telegram today rolling out an update which brings with it several new features.The update also adds interactive emoji. When you send one of the select animated emoji in chat, you can now tap on it to initiate a full screen animation. The update also adds interactive emoji. When you send one of the select animated emoji in chat, you can now tap on it to initiate a full screen animation. This is then visible to you or anyone else who's also present in chat at the moment. The animations are also accompanied by vibrations. This is then visible to you or anyone else who's also present in chat at the moment. The animations are also accompanied by vibrations.

telegram from ar


Telegram C++ Academy
FROM USA