Cod sursa(job #429640)

Utilizator nandoLicker Nandor nando Data 30 martie 2010 12:40:22
Problema Loto Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <vector>
#include <utility>

using namespace std;

#define HASH 666013
#define MAX 100

struct tri{
	int i,j,sum;
	
};

typedef vector<pair<int,int> >::iterator iter;

vector<pair<int,int> > hash[HASH];
vector<tri> s;
int n,sum,nr[MAX];

iter findHash(int suma){
	int a=suma%HASH;
	for(iter it=hash[a].begin();it!=hash[a].end();it++){
		if(it->second==suma){
			return it;
		}
	}
	return hash[a].end();
}

void addHash(pair<int,int> e){
	int a=e.second%HASH;
	if(findHash(e.second)==hash[a].end()){
		hash[a].push_back(e);
	}
}
int findID(int s){
	iter it=findHash(s);
	if(it!=hash[s%HASH].end()){
		return it->first;
	}else{
		return -1;
	}
}
int main(){
	FILE* fin=fopen("loto.in","r");
	freopen("loto.out","w",stdout);

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

	for(int i=0;i<n;i++){
		fscanf(fin,"%d ",&nr[i]);
	}

	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			tri t;
			t.i=i,t.j=j,t.sum=nr[i]+nr[j];
			addHash(make_pair(s.size(),t.sum));
			s.push_back(t);
		}
	}
	bool fnd=false;
	for(int i=0;i<s.size()&&!fnd;i++){
		for(int j=0;j<s.size()&&!fnd;j++){
			int k=findID(abs(sum-s[i].sum-s[j].sum));
			if(k!=-1){
				printf("%d %d %d %d %d %d\n",nr[s[i].i],nr[s[i].j],
											 nr[s[j].i],nr[s[j].j],
											 nr[s[k].i],nr[s[k].j]);
				fnd=true;
			}
		}
	}
	if(!fnd){
		printf("-1\n");
	}
	fclose(fin);
	return 0;
}