Cod sursa(job #2893778)

Utilizator 4N70N1U5Antonio Nitoi 4N70N1U5 Data 26 aprilie 2022 17:33:16
Problema Loto Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <vector>
#include <unordered_map>

std::ifstream fin("loto.in");
std::ofstream fout("loto.out");

template <class T>
struct triplet
{
    T first, second, third;
}; // Structura similara cu pair, dar pentru trei valori de acelasi fel.

int main()
{
    int N, S;

    fin >> N >> S;

    std::vector<int> Numere(N); // Numerele date in fisierul de intrare.
    std::unordered_map< int, triplet<int> > Sume;
    // In acest map voi stoca sumele ce se pot obtine din combinari de cate trei numere,
    // si care sunt numerele ce dau acea suma. Cheile vor fi sumele, iar valorile
    // tripletii formati din acele trei numere.

    for (int i = 0; i < N; i++)
        fin >> Numere[i];

    for (int i = 0; i < N; i++)
        for (int j = i; j < N; j++)
            for (int k = j; k < N; k++)
            {
                triplet<int>* ElemSume = &Sume[Numere[i] + Numere[j] + Numere[k]];
                ElemSume->first = Numere[i];
                ElemSume->second = Numere[j];
                ElemSume->third = Numere[k];
                // Adaug suma curenta si tripletul din care se obtine in map.
            }

    for (int i = 0; i < N; i++)
        for (int j = i; j < N; j++)
            for (int k = j; k < N; k++)
                if (Sume.find(S - (Numere[i] + Numere[j] + Numere[k])) != Sume.end())
                {
                    triplet<int>* ElemSume = &Sume[S - (Numere[i] + Numere[j] + Numere[k])];
                    fout << Numere[i] << ' ';
                    fout << Numere[j] << ' ';
                    fout << Numere[k] << ' ';
                    fout << ElemSume->first << ' ';
                    fout << ElemSume->second << ' ';
                    fout << ElemSume->third;
                    return 0;
                    // Verific daca exista in map complementul sumei curente pentru a
                    // obtine suma S cautata. Daca exista, atunci afisez numerele gasite.
                }

    fout << -1;

    return 0;
}