Cod sursa(job #2596041)

Utilizator hitmannCiocas Radu hitmann Data 9 aprilie 2020 08:12:59
Problema Loto Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cinttypes>
#include <unordered_map>

using namespace std;

struct Sum3
{
    int x1;
    int x2;
    int x3;
    uint64_t sum;

    bool operator==(const Sum3& p) const
    {
        return (p.x1 == x1) && (p.x2 == x2) && (p.x3 == x3);
    }
};

int main()
{
    FILE* infile;
    FILE* outfile;

    infile = fopen("loto.in", "r");
    if (infile == NULL)
    {
        cout << "error opening infile\n";
        return -1;
    }

    outfile = fopen("loto.out", "w");
    if (outfile == NULL)
    {
        cout << "error opening out file\n";
        return -2;
    }

    int n, i, j, k;
    uint64_t s;
    uint64_t *numbers;
    unordered_map<uint64_t, Sum3> sums;

    fscanf(infile, "%d %" SCNd64, &n, &s);
    //printf("got n %d s %" SCNd64 " \n", n, s);

    numbers = new uint64_t[n];

    for (i = 0; i < n; i++)
        fscanf(infile, "%" SCNd64, &numbers[i]);


    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            for (k = 0; k < n; k++)
            {
                Sum3 e;
                e.x1 = i;
                e.x2 = j;
                e.x3 = k;
                e.sum = numbers[i] + numbers[j] + numbers[k];

                sums[e.sum] = e;
            }
        }
    }

    bool found = false;
    Sum3 a, b;
    for (auto& it : sums)
    {
        if (it.first > s)
            continue;

        uint64_t target = (s - it.first);

        auto search = sums.find(target);
        if (search != sums.end()) {
            found = true;
            a.x1 = it.second.x1;
            a.x2 = it.second.x2;
            a.x3 = it.second.x3;

            b.x1 = search->second.x1;
            b.x2 = search->second.x2;
            b.x3 = search->second.x3;
            break;
        }

    }


    if (found)
    {
        fprintf(outfile, "%" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64,
                numbers[a.x1], numbers[a.x2], numbers[a.x3], numbers[b.x1], numbers[b.x2], numbers[b.x3]);
    }
    else
    {
        fprintf(outfile, "-1");
    }

    fclose(infile);
    fclose(outfile);

    return 0;
}