Задание 27. Информатика. ЕГЭ. Поляков-2670

Просмотры: 70
Изменено: 23 ноября 2024

(Д.Ф. Муфаззалов) Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на \(4\) и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи.

Входные данные. Даны два входных файла (файл \(A\) и файл \(B\)), каждый из которых содержит в первой строке количество троек \(N\) (\(1 \leqslant N \leqslant 100000\)). Каждая из следующих \(N\) строк содержит три натуральных числа, не превышающих \(10~000\).

Пример входного файла:

\(6\)
\(1 \,\, 3 \,\, 2\)
\(5 \,\, 12 \,\, 12\)
\(6 \,\, 8 \,\, 12\)
\(5 \,\, 4 \,\, 12\)
\(3 \,\, 3 \,\, 12\)
\(1 \,\, 1 \,\, 13\)

Для указанных входных данных значением искомой суммы должно быть число \(63\).

В ответе укажите два числа: сначала значение искомой суммы для файла \(А\), затем для файла \(B\).

Файл с данными

Решение:

C++


#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>

using namespace std;

int32_t main()
{
    string base = "";
    string fnames[] = {"27-A.txt", "27-B.txt"};

    for(string fn: fnames) {
        ifstream in(base + fn);
        
        int n, s = 0, d = 1000000;
        in >> n;


        for(int i = 0; i < n; i++) {
            int t[3];
            in >> t[0] >> t[1] >> t[2];
            sort(t, t+3);

            s += t[2];
            if(abs(t[2] - t[1]) % 4)
                d = min(d, abs(t[2] - t[1]));
            else if (abs(t[2] - t[0]) % 4) 
                d = min(d, abs(t[2] - t[0]));
        }

        if (s % 4 == 0)
            s -= d;

        cout << s << '\n';

    }
}

Ответ: \(15062 \,\, 45226419\)