Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ ПОМОГИТЕ ПРОШУ ОЧЕНЬ

Leyla Nuriyeva Ученик (118), открыт 1 день назад
У нас есть три набора чисел - А, В и С. Можно ли взять из каждого набора по одному числу а, b и с так,
что для заданного числа К выполняется равенство а^2 + b^2 + c^2 = k?
В первой строке записаны четыре натуральных числа n, m, t и к - размеры каждого из трех наборов и число k
Выведите три числа: номера чисел из каждого набора согласно заданному во входных данных порядку, которые
подходят под указанное равенство. Нумерация чисел в наборах начинается с единицы. Если правильных ответов
несколько, то выведите любой из них.


Вход
3 4 4 3
2 1 3
1 2 2 1
2 3 1 2
Вывод
2 1 3
3 ответа
Vvv Vvvvvvv Ученик (125) 1 день назад
3 4 2 3 - это один из возможных правильныхответов.
Алексей Пинчук Мудрец (16885) 1 день назад
Надо просто перебрать все комбинации.
 #include <iostream> 
#include <vector>

using namespace std;

int main()
{
int n, m, t, k;
cin >> n >> m >> t >> k;
vector<int> A(n), B(m), C(t);
for(int& x : A) cin >> x;
for(int& x : B) cin >> x;
for(int& x : C) cin >> x;

bool found = false;
for(int a = 0; a < A.size() && !found; ++a)
for(int b = 0; b < B.size() && !found; ++b)
for(int c = 0; c < C.size() && !found; ++c)
if(A[a] * A[a] + B[b] * B[b] + C[c] * C[c] == k)
{
cout << a+1 << ' ' << b+1 << ' ' << c+1;
found = true;
}
}
ПапаВысший разум (145326) 1 день назад
А ну как там массивы по 10-100 тыс штук элементов каждый?
Алексей Пинчук Мудрец (16885) Папа, на таких объёмах, конечно, лучше сперва отсортировать массивы. Но это же учебная задача, никто топы на ней штурмовать не собирается. :)
Николай Веселуха Высший разум (370948) 1 день назад
 #include <array> 
#include <iostream>
#include <map>

using namespace std;

class SumSquares {
private:
static const size_t length = 3;
public:
using key_t = unsigned;
using value_t = size_t;
using map_t = map<key_t, value_t>;
using box_t = array<map_t, length>;
using item_t = pair<key_t, value_t>;
using result_t = pair<bool, array<item_t, length>>;
using values_t = array<value_t, length>;
private:
key_t target = 0;
box_t box;
map_t fill(istream& inp, const value_t count) {
map_t item;
key_t key;
for (value_t value = 0; value < count; ++value) {
inp >> key;
if (!item.contains(key) && key * key < target) {
item.insert({ key, value + 1 });
}
}
return item;
}
static bool is_not_exists(key_t key) {
while (key % 4 == 0) key /= 4;
return key % 8 == 7;
}
bool is_exists(const key_t a, const key_t b, const key_t c) const {
return target == a * a + b * b + c * c;
}
result_t result() const {
result_t res{};
for (const auto& a : box[0]) {
res.second[0] = a;
for (const auto& b : box[1]) {
res.second[1] = b;
for (const auto& c : box[2]) {
res.second[2] = c;
if (is_exists(a.first, b.first, c.first)) {
res.first = true;
return res;
}
}
}
}
return res;
}
friend istream& operator>>(istream& inp, SumSquares& ss) {
values_t values{};
for (auto& value : values) inp >> value;
inp >> ss.target;
size_t i = 0;
for (auto& item : ss.box) {
item = ss.fill(inp, values[i]);
++i;
}
return inp;
}
friend ostream& operator<<(ostream& out, const SumSquares& ss) {
if (SumSquares::is_not_exists(ss.target)) return out << "-1";
const auto& [status, result] = ss.result();
if (!status) return out << "-1";
for (const auto& [key, value] : result) out << value << ' ';
return out;
}
};

int main() {
SumSquares sum_squares;
cin >> sum_squares;
cout << sum_squares << '\n';
}
Похожие вопросы