Cod sursa(job #2439116)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 15 iulie 2019 00:39:34
Problema Loto Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, z;
long long s, v[107];

const int p = 666013;
vector <int> H[p + 3];

struct triplet
{
    long long nr1, nr2, nr3, suma;
}sum[1030301];

int h(int x)
{
    return x % p;
}

int cauta(int x)
{
    int r = h(x);
    for (int i = 0; i < H[r].size(); ++i)
    {
        if (H[r][i] == x)
        {
            return i;
        }
    }
    return -1;
}

void adauga(int x)
{
    int r = h(x);
    if (cauta(x) == -1)
    {
        H[r].push_back(x);
    }
}


void Read()
{
    fin >> n >> s;
    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i];
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = i; j <= n; ++j)
        {
            for (int k = j; k <= n; ++k)
            {
                sum[++z] = {v[i], v[j], v[k], v[i] + v[j] + v[k]};
                adauga(sum[z].suma);
            }
        }
    }
}

void Solve()
{
    long long sum1 = -1, sum2 = -1;
    for (int i = 1; i <= z; ++i)
    {
        long long s2 = s - sum[i].suma;
        if (cauta(s2) != -1)
        {
            sum1 = sum[i].suma;
            sum2 = s2;
            break;
        }
    }
    if (sum2 == -1)
    {
        fout << -1;
        return;
    }
    long long v[6], c = 0;
    for (int i = 1; i <= z; ++i)
    {
        if (sum[i].suma == sum1)
        {
            v[c++] = sum[i].nr1;
            v[c++] = sum[i].nr2;
            v[c++] = sum[i].nr3;

        }
        if (sum[i].suma == sum2)
        {
            v[c++] = sum[i].nr1;
            v[c++] = sum[i].nr2;
            v[c++] = sum[i].nr3;
        }
    }
    sort(v, v + c);
    for (int i = 0; i < c; ++i)
    {
        fout << v[i] << " ";
    }
}

int main()
{
    Read();
    Solve();
    fin.close();
    fout.close();
    return 0;
}