Cod sursa(job #1826035)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 9 decembrie 2016 23:32:22
Problema Loto Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
# include <stdio.h>
# include <stdlib.h>

# include <vector>
# include <iostream>

# define MAX_N 101
# define infinit 100000001

# define MOD ( 1 << 13 )

using namespace std;

int v[MAX_N];

struct pereche
{
    int a, b, c;
    int s;
} notfound, p, aux;

vector<struct pereche> h[MOD + 1];

void push( pereche a )
{
    h[a.s % MOD].push_back( a );
}

pereche &find( int s )
{
    int i = 0;
    int t = s % MOD;

    while ( i < h[t].size() && h[t][i].s != s )
        i ++;

    if ( i < h[t].size() )
        return h[t][i];
    else
        return notfound;
}

int main()
{
    notfound.s = -1;

    FILE *fin = fopen( "loto.in", "r" ), *fout = fopen( "loto.out", "w" );

    int n, i, j, k, S;

    fscanf( fin, "%d%d", &n, &S );

    for ( i = 1; i <= n; i ++ )
        fscanf( fin, "%d", &v[i] );

    i = j = k = 1;
    while ( i <= n && ( v[i] + v[j] + v[k] >= S || find( S - v[i] - v[j] - v[k] ).s == -1 ) )
    {
        aux.a = v[i];
        aux.b = v[j];
        aux.c = v[k];
        aux.s = v[i] + v[j] + v[k];
        push( aux );

        k ++;
        if ( k > n )
        {
            k = 1;
            j ++;
            if ( j > n )
            {
                j = 1;
                i ++;
            }
        }
    }

    if ( i <= n )
    {
        p = find( S - v[i] - v[j] - v[k] );
        fprintf( fout, "%d %d %d %d %d %d", p.a, p.b, p.c, v[i], v[j], v[k] );
    }
    else
        fprintf( fout, "-1" );

    fclose( fin );
    fclose( fout );

    return 0;
}