Cod sursa(job #964396)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 20 iunie 2013 21:01:09
Problema Loto Scor 65
Compilator cpp Status done
Runda becalisme Marime 1.54 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

#define NMAX 101
#define MOD 700001
#define defit vector<sum2>::iterator 

int i, N, S, s2;
int v[NMAX];
int j, k, n;
struct sum{int val, x, y, z;} Sum[NMAX * NMAX * NMAX];
struct sum2{int val, ord;} s;
int ind1, ind2;
int H;
vector <sum2> Hash[MOD + 3];

struct cmp {
	bool operator()(const sum &a, const sum &b) const {
		if (a.val < b.val) return 1;
		return 0;
	}
};

inline int Search_Hash1(int X) {
	H = X % MOD;
	for (defit it = Hash[H].begin(); it != Hash[H].end(); ++it) 
		if ((*it).val == X) {
			ind2 = (*it).ord;
			return 1;
		}
	return 0;
}

inline int Search_Hash2(int Y) {
	H = Y % MOD;
	for (defit it = Hash[H].begin(); it != Hash[H].end(); ++it)
		if ((*it).val == Y) return 1;
	return 0;
}

int main() {
	freopen("loto.in","r",stdin);
	freopen("loto.out","w",stdout);
	scanf("%i%i", &N, &S);
	for (i = 1; i <= N; ++i)
		scanf("%i", &v[i]);
	for (i = 1; i <= N; ++i) {
		for (j = 1; j <= N; ++j) {
			for (k = 1; k <= N; ++k) {
				s.val = v[i] + v[j] + v[k];
				s2 = s.val;
				if (!Search_Hash2(s2)) {
					Sum[++n].val = s.val;
					Sum[n].x = i;
					Sum[n].y = j;
					Sum[n].z = k;
					s.ord = n;
					H = s2 % MOD;
					Hash[H].push_back(s);
				}
			}
		}
	}
	for (i = 1; i <= n; ++i) {
		if (Search_Hash1(S - Sum[i].val)) {
			printf("%i %i %i %i %i %i\n", v[Sum[i].x], v[Sum[i].y], v[Sum[i].z], v[Sum[ind2].x], v[Sum[ind2].y], v[Sum[ind2].z]);
			return 0;
		}
	}
	printf("-1\n");
	return 0; 
}