Cod sursa(job #196575)

Utilizator blasterzMircea Dima blasterz Data 27 iunie 2008 11:44:17
Problema Loto Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#define maxh 666013

struct nod { int v; nod *n;}; 
nod *H[maxh];

int a[128];
int n,S;

void read()
{
    freopen("loto.in","r",stdin);
    scanf("%d %d\n", &n, &S);
    int i;
    for(i=1;i<=n;++i) scanf("%d ", a+i);
}

inline void insert(int v)
{
    int h=v%maxh;
    nod *p=new nod;
    p->v=v;
    p->n=H[h];
    H[h]=p;
}

inline int find(int v)
{
    int h=v%maxh;
    for(nod *p=H[h]; p; p=p->n)
	if(p->v==v)return 1;
    return 0;
}

void afis(int S)
{
    int i,j,k;
    for(i=1;i<=n;++i)
	for(j=i;j<=n;++j)
	    for(k=j;k<=n;++k)
		if(a[i]+a[j]+a[k]==S)
		{
		    printf("%d %d %d\n", a[i], a[j], a[k]);
		    return ;
		}

}


void solve()
{
    int i,j,k;

    for(i=1;i<=n;++i)
	for(j=i;j<=n;++j)
	    for(k=j;k<=n;++k)
		insert(a[i]+a[j]+a[k]);


    for(i=1;i<=n;++i)
	for(j=i;j<=n;++j)
	    for(k=j;k<=n;++k)
		if(S-(a[i]+a[j]+a[k])>=0)
		    if(find(S-(a[i]+a[j]+a[k])))
		    {
			printf("%d %d %d ", a[i], a[j], a[k]);
			afis(S-(a[i]+a[j]+a[k]));
			return ;
		    }

    printf("-1\n");
}

int main()
{
    freopen("loto.out","w",stdout);
    read();
    solve();
    return 0;
}