Нужно на c++ Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел делилась на 11 и при этом была минимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число – минимально возможную сумму, соответствующую условиям задачи.
Входные данные. Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.
Пример входного файла:
6
8 3 4
4 8 12
9 5 6
2 8 3
12 3 5
1 4 12
Для указанных входных данных значением искомой суммы должно быть число 22.
В ответе укажите два числа: сначала искомое значение для файла А, затем для файла B.
Ответ 5896 14078757
C/C++
Программа на с++
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
class Item {
public:
Item() = default;
Item(const string& s) {
istringstream iss(s);
unsigned n;
while (iss >> n) item.push_back(n);
sort(item.begin(), item.end());
}
const vector<unsigned>& data()const {
return item;
}
private:
vector<unsigned> item;
friend bool operator<(const Item& a, const Item& b) {
return a.item < b.item;
}
};
class Box {
public:
bool load(string&& path) {
ifstream file(path);
if (file.is_open()) {
unsigned n;
file >> n;
if (!n || n > 100000) {
file.close();
return false;
}
string s;
while (getline(file, s)) if (!s.empty()) box.emplace(Item(s));
file.close();
return true;
}
return false;
}
unsigned msf()const {
auto sum = 0U;
for (const auto& item : box) sum += item.data().at(0);
return sum;
}
unsigned work(const unsigned smn, const unsigned n)const {
if (0 == smn % n) return smn;
for (const auto& item : box) {
auto x = smn - item.data().at(0);
auto sum = x + item.data().at(1);
if (0 == sum % n) return sum;
sum = x + item.data().at(2);
if (0 == sum % n) return sum;
}
return 0;
}
private:
multiset<Item> box;
};
int main() {
const auto x = 11U;
Box a;
if (a.load("A")) {
auto smn = a.msf();
auto res = a.work(smn, x);
if (res) cout << res << ' ';
}
Box b;
if (b.load("B")) {
auto smn = b.msf();
auto res = b.work(smn, x);
if (res) cout << res;
}
puts("");
system("pause > nul");
}
#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
class Item {
public:
Item() = default;
Item(const string& s) {
istringstream iss(s);
unsigned n;
while (iss >> n) item.push_back(n);
sort(item.begin(), item.end());
}
const vector<unsigned>& data()const {
return item;
}
private:
vector<unsigned> item;
friend bool operator<(const Item& a, const Item& b) {
return a.item < b.item;
}
};
class Box {
public:
bool load(string&& path) {
ifstream file(path);
if (file.is_open()) {
unsigned n;
file >> n;
if (!n || n > 100000) {
file.close();
return false;
}
string s;
while (getline(file, s)) if (!s.empty()) box.emplace(Item(s));
file.close();
return true;
}
return false;
}
unsigned msf()const {
auto sum = 0U;
for (const auto& item : box) sum += item.data().at(0);
return sum;
}
unsigned work(const unsigned smn, const unsigned n)const {
if (0 == smn % n) return smn;
for (const auto& item : box) {
auto x = smn - item.data().at(0);
auto sum = x + item.data().at(1);
if (0 == sum % n) return sum;
sum = x + item.data().at(2);
if (0 == sum % n) return sum;
}
return 0;
}
private:
multiset<Item> box;
};
int main() {
const auto x = 11U;
Box a;
if (a.load("A")) {
auto smn = a.msf();
auto res = a.work(smn, x);
if (res) cout << res << ' ';
}
Box b;
if (b.load("B")) {
auto smn = b.msf();
auto res = b.work(smn, x);
if (res) cout << res;
}
puts("");
system("pause > nul");
}
Бяда
Алексей Галустян
у меня есть решение подобия этой программы с другим условием, но тип задачи такой же
Похожие вопросы
- Написать программу на языке Си
- Некорректно работает написанная программа
- Написать программу на с++
- Помогите написать программу на С++
- Написать программы на СИ
- Помогите разобраться с программой
- Написать программу в С++ (нахождение площади трапеции)
- Помогите дополнить программу по условию
- Программа не выполняет условия задания, исходный массив меняет сам себя, помогите найти ошибку
- Программа на с++.
Вот пример входных данных.
6
5 6 7
4 7 12
2 5 14
2 8 13
3 12 15
1 12 14