Cod sursa(job #129195)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 28 ianuarie 2008 19:12:12
Problema Loto Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#define sch(x,y) x^=y^=x^=y
#define nmax 200001

long int bal[nmax],a[101],n,s,sol=-1,b[7],m;

void recdw(long int i)
  {
     long int poz=i;
     if(2*i<=m)
       if(bal[2*i]>bal[poz])
	 poz=2*i;
     if(2*i+1<=m)
       if(bal[2*i+1]>bal[poz])
	 poz=2*i+1;
     if(i!=poz)
       {
	  sch(bal[i],bal[poz]);
          recdw(poz);
       }
  }

int main()
  {
     FILE *fi=fopen("loto.in","r"),
	  *fo=fopen("loto.out","w");
     fscanf(fi,"%ld %ld",&n,&s);
     long int i,j,k,nr=0,r,c;
     for(i=1;i<=n;i++)
       {
	  fscanf(fi,"%ld",&a[i]);
       }
     fclose(fi);
     for(i=1;i<=n;i++)
       for(j=i;j<=n;j++)
	 for(k=j;k<=n;k++)
	      bal[++nr]=a[i]+a[j]+a[k];
     for(i=nr/2,m=nr;i;i--)
       recdw(i);
     for(i=nr,m=nr-1;i>1;i--,m--)
       {
	  sch(bal[1],bal[i]);
	  recdw(1);
       }
     for(i=1,j=nr;i<=j;i++)
       {
	  for(;bal[j]>s-bal[i];j--);
	  if(bal[j]+bal[i]==s)
            sol=bal[j];
       }
     if(sol==-1)
       fprintf(fo,"-1\n");
     else
       {
	  for(i=1;i<=n;i++)
	    for(j=i;j<=n;j++)
	      for(k=j;k<=n;k++)
		if(a[j]+a[i]+a[k]==sol)
		  {
		     b[3]=a[i];
		     b[4]=a[j];
		     b[5]=a[k];
		  }
	  sol=s-sol;
	  for(i=1;i<=n;i++)
	    for(j=i;j<=n;j++)
	      for(k=j;k<=n;k++)
		if(a[j]+a[i]+a[k]==sol)
		  {
		     b[0]=a[i];
		     b[1]=a[j];
		     b[2]=a[k];
		  }
	  for(i=0;i<=5;i++)
	    for(j=0;j<5;j++)
	      if(b[j]>b[j+1])
		sch(b[j],b[j+1]);
	  for(i=0;i<=5;i++)
	    fprintf(fo,"%ld ",b[i]);
	  fprintf(fo,"\n");
       }
     fclose(fo);
     return(0);
  }