Cod sursa(job #203564)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 17 august 2008 15:21:01
Problema Loto Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
using namespace std;

#include <cstdio>
#include <algorithm>
#include <map>

#define IN "loto.in"
#define OUT "loto.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i) 
#define N_MAX 1<<7 


int N,S;
int v[N_MAX];
int V[N_MAX*3];

inline int find(int val)  
{  
    int p=1,q=V[0],m;  
    while(p<q)  
    {  
        m=(p+q)>>1;  
        if(val<=V[m])  
            q=m;  
		else  
			p=m+1;  
    }  
    if(V[p]==val)  
        return p;  
    return 0;  
}  

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d\n", &N,&S);
	FOR(i,1,N)
		scanf("%d", &v[i]);
}

void solve()
{
	FOR(i,1,N)
	FOR(j,i,N)
	FOR(k,j,N)
		V[ ++V[0] ] = v[i] + v[j] + v[k];
	
	sort(V+1, V+V[0]);
	
	FOR(ii,1,V[0])
	{
		int ok = find(S-V[ii]);
		if(ok)
		{
			int k1(1),k2(1);
			FOR(i,1,N)
			FOR(j,i,N)
			FOR(k,j,N)
			{
				if(k1 && v[i] + v[j] + v[k] == V[ii])
					printf("%d %d %d ",v[i],v[j],v[k]),k1=0;
				if(k2 && v[i] + v[j] + v[k] == S-V[ii])
					printf("%d %d %d ",v[i],v[j],v[k]),k2=0;
			}
			return;
		}
	}	
	printf("-1\n");
}

int main()
{
	scan();
	solve();
	return 0;
}