Cod sursa(job #1809348)

Utilizator ovidiu_zic@yahoo.comPurecel Mihai [email protected] Data 18 noiembrie 2016 20:57:58
Problema Loto Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("loto.in");
ofstream out("loto.out");

const int k = 666019, N = 100000001;

int lst[k],v[101], val[N], urm[N];
int nr, x, n, s;

void adauga(int x){
    int r = x%k;
    nr++;
    val[nr] = x;
    urm[nr] = lst[r];
    lst[r] = nr;
}

bool exista(int x){
    int r = x%k,p;
    p = lst[r];
    while(p!=0){
        if(val[p] == x)
            return true;
        p = urm[p];
    }
    return false;
}

void scrie(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(v[i]+v[j]+v[k] == s){
                    out<<v[i]<<" "<<v[j]<<" "<<v[k];
                    return;
                }
}

int main()
{
    in>>n>>s;
    int i,j,k;
    for(i=1;i<=n;i++)
        in>>v[i];

    for(i=1;i<=n;i++)
        for(j=i;j<=n;j++)
            for(k=j;k<=n;k++)
                adauga(v[i]+v[j]+v[k]);

    for(i=1;i<=n;i++)
        for(j=i;j<=n;j++)
            for(k=j;k<=n;k++){
                if(v[i]+v[j]+v[k] <=s && exista(s-v[i]-v[j]-v[k])){
                    out<<v[i]<<" "<<v[j]<<" "<<v[k]<<" ";
                    scrie(s-v[i]-v[j]-v[k]);
                    return 0;
                }
            }
    out << "-1";

    return 0;
}