Cod sursa(job #792039)

Utilizator idainetJohn Doe idainet Data 26 septembrie 2012 12:24:47
Problema Loto Scor 0
Compilator cpp Status done
Runda asem-etapa1 Marime 2 kb
//
//  main.cpp
//  a1
//
//  Created by abc on 9/20/12.
//  Copyright (c) 2012 abc. All rights reserved.
//

# include <iostream>
# include <cstdio>
# include <cstdlib>
# include <iomanip>
# include <cmath>
# include <map>
# include <vector>
# include <set>
# include <algorithm>

using namespace std;

# define ISALPHA(Q) (('a' <= Q && Q <= 'z') || ('A' <= Q && Q <= 'Z'))
# define ISDIGIT(a) ('0' <= a  && a <= '9')
# define TODIGIT(a) (a - '0')

# define LIKELY(a)   (__builtin_expect((a), 1))
# define UNLIKELY(a) (__builtin_expect(!!(a), 0))

typedef unsigned char U8;
typedef long long LONG;

void init()
{
    freopen("loto.in", "r", stdin);
    freopen("loto.out", "w", stdout);
}

template <typename T> void read(vector<T> &vec)
{
    for(size_t i=0; i<vec.size(); ++i) {
        cin >> vec[i];
    }
}

typedef struct {
    int sum;
    int a,b,c;
} Cont_t;

bool cmp(const Cont_t &a, const Cont_t &b)
{
    return (a.sum < b.sum);
}

int main(int argc, const char * argv[])
{
    init();
    
    int N, S; cin >> N >> S;
    vector<int> vec(N); read(vec);
    //sort(vec.begin(), vec.end());
    
    vector<Cont_t> conv; conv.reserve(N*N*N);
    
    for(int i=0; LIKELY(i<N); ++i)
    {
        for(int k=0; LIKELY(k<N); ++k)
        {
            for(int j=0; LIKELY(j<N); ++j)
            {
                conv.push_back(Cont_t { .sum = (vec[i] + vec[k] + vec[j]),
                                        .a = vec[i], .b = vec[k], .c = vec[j]});
            }
        }
    }
    sort(conv.begin(), conv.end(), cmp);
    
    for(size_t left=0, right=conv.size()-1; left <= right; )
    {
        int tS = conv[left].sum + conv[right].sum;
        if (tS == S)
        {
            printf("%d %d %d %d %d %d", conv[left].a, conv[left].b, conv[left].c,
                                        conv[right].a, conv[right].b, conv[right].c);
            return 0;
        }
        else if (tS < S) ++left;
        else if (tS > S) --right;
        else {
            throw(42);
        }
    }
    
    cout << -1;
    
    return 0;
}