Cod sursa(job #1809321)

Utilizator AndreiDumitrescuAndrei Dumitrescu AndreiDumitrescu Data 18 noiembrie 2016 20:23:21
Problema Loto Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("loto.in");
ofstream g("loto.out");

int lst[666019], urm[1000010] , nr, k = 666019, v[101],sol1  , sol2, sol3 ;

struct h{
    int a , b , c, v;
} val[1000010];

bool exista(int x)
{
    int r = x % k, p;
    p = lst[r];
    while(p != 0)
    {
        if(val[p].v == x)
            {
                sol1 = val[p].a;
                sol2 = val[p].b;
                sol3 = val[p].c;
                return true;
            }
        p = urm[p];
    }
    return false;
}

void adauga(int x, int t , int y, int z)
{
    if(exista(x) != 1)
    {
        int r = x % k;
        nr++;
        val[nr].v = x;
        val[nr].a = t;
        val[nr].b = y;
        val[nr].c = z;
        urm[nr] = lst[r];
        lst[r] = nr;
    }
}

int main()
{
    int n, s, i , j ,ij;
    f >> n >> s;
    for( i = 1; i <= n ; i++)
        f >> v[i];
    for(i = 1 ; i <= n ; i++)
        for(j = 1 ; j <= n ; j++)
            for(ij = 1 ; ij <= n ; ij++)
                adauga(v[i]+v[j]+v[ij], v[i], v[j], v[ij]);
    for(i = 1 ; i <= n ; i++)
        for(j = 1 ; j <= n ; j++)
            for(ij = 1 ; ij <= n ; ij++)
            {
                if(exista(s - v[i]- v[j] - v[ij]))
                    {
                        g << v[i] << " " << v[j] << " " << v[ij] << " " << sol1 << " " << sol2 << " " << sol3 ;
                        return 0;
                    }
            }
    g << -1;

}