Cod sursa(job #1041305)

Utilizator myshuSpatariu Mihai-Constantin myshu Data 25 noiembrie 2013 18:46:15
Problema Loto Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<fstream>
#include<algorithm>
using namespace std;
int v[101],w[4][1000001],w2[4][1000001];
void merge(int stg,int dr)
{
	if(stg!=dr){merge(stg,(dr+stg)/2);merge((stg+dr)/2+1,dr);}
	int i=stg,j=(stg+dr)/2+1,u=0;
	while(i<=(stg+dr)/2&&j<=dr)
	{
		if(w[0][i]<=w[0][j]){w2[0][++u]=w[0][i];
							 w2[1][u]=w[1][i];
							 w2[2][u]=w[2][i];
							 w2[3][u]=w[3][i];
							 i++;}
		else {w2[0][++u]=w[0][j];
			  w2[1][u]=w[1][j];
			  w2[2][u]=w[2][j];
			  w2[3][u]=w[3][j];
			  j++;}
	}
	while(i<=(stg+dr)/2){w2[0][++u]=w[0][i];
						 w2[1][u]=w[1][i];
						 w2[2][u]=w[2][i];
						 w2[3][u]=w[3][i];
						 i++;}
	while(j<=dr){w2[0][++u]=w[0][j];
				 w2[1][u]=w[1][j];
				 w2[2][u]=w[2][j];
				 w2[3][u]=w[3][j];
				 j++;}
	for(i=stg;i<=dr;i++)
		{w[0][i]=w2[0][i-stg+1];
		 w[1][i]=w2[1][i-stg+1];
		 w[2][i]=w2[2][i-stg+1];
		 w[3][i]=w2[3][i-stg+1];}
}
int binara(int poz, int d, int pas, int val)
{
	if(pas==0)return -1;
	if(poz+pas>d)return binara(poz,d,pas>>1,val);
	int a=w[0][poz+pas];
	if(a>val) return binara(poz,d,pas>>1,val);
	else if(a<val)return binara(poz+pas,d,pas>>1,val);
	else return poz+pas;
}
int main()
{
	ifstream fcin("loto.in");
	ofstream fcout("loto.out");
	int n,s,j,k,i,u=0;
	fcin>>n>>s;
	for(i=1;i<=n;i++)
		fcin>>v[i];
	for(i=1;i<=n;i++)
		for(j=i;j<=n;j++)
			for(k=j;k<=n;k++)
				{w[0][u]=v[i]+v[j]+v[k];
				 w[1][u]=v[i];w[2][u]=v[j];w[3][u++]=v[k];}
	merge(0,u-1);
	for(i=0;i<u;i++)
		{k=binara(0,u-1,1<<20,s-w[0][i]);
			if(k>-1){fcout<<w[1][i]<<' '<<w[2][i]<<' '<<w[3][i]<<' '<<w[1][k]<<' '<<w[2][k]<<' '<<w[3][k]<<' '<<'\n';break;}
		}
	if(i==u)fcout<<'-1'<<'\n';
	return 0;
}