Cod sursa(job #964185)

Utilizator gigi_becaliGigi Becali gigi_becali Data 20 iunie 2013 12:35:43
Problema Loto Scor 100
Compilator cpp Status done
Runda becalisme Marime 1.56 kb
#include <cstdio>
#define maxh 666013 // numar prim
struct node{ int v; node *next;};
 
node *H[maxh];
 
inline void insert(int v)
{
    int h=v%maxh;
    node *p;
    for(p=H[h];p;p=p->next)
        if(p->v == v) return ;
    p=new node;
    p->v=v;
    p->next=H[h];
    H[h]=p;
}
 
inline int find(int v)
{
    int h=v%maxh;
    for(node *p=H[h]; p; p=p->next)
        if(p->v == v) return 1;
    return 0;
}
 
int a[128], n, S;
 
int main()
{
     
    int i, j, k;
    int ii, jj, kk;
     
    freopen("loto.in","r",stdin);
    freopen("loto.out","w",stdout);
     
    scanf("%d %d\n", &n, &S);
    for(i=1; i<=n; ++i) scanf("%d ", a+i);
     
    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]);
                     
                        for(ii=1; ii<=n; ++ii)
                            for(jj=ii; jj<=n; ++jj)
                                for(kk=jj; kk<=n; ++kk)
                                    if(a[ii]+a[jj]+a[kk]==S-a[i]-a[j]-a[k])
                                    {
                                        printf("%d %d %d\n", a[ii], a[jj], a[kk]);
                                        return 0;
                                    }
                    }
                 
    printf("-1\n");
     
    return 0;
}