Cod sursa(job #276449)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 11 martie 2009 10:27:20
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream.h>
#include <fstream.h>

#define IN "loto.in"
#define OUT "loto.out"
#define MAX 1000001
#define vall 1001

ifstream fin(IN);
ofstream fout(OUT);

long nr[vall],alege[MAX];
char sume[MAX];
char sume1[MAX];
long alese[vall];
long n,s,suma,cnt,cate;

void citire();
void pas();
void alg();
void afis();
void procesez();
int verif(long);

int main()
{
 citire();
 fin.close();

 alg();
 pas();
 if(cnt)
  procesez();

 afis();
  fout.close();

return 0;
}

void citire()
{
 long i,j;
 long nrr=0;

 fin>>n>>suma;
  for(i=1;i<=n;i++)
   for(j=1;j<=6;j++)
   {
    nrr++;
    if(j==1)
    {
     fin>>nr[nrr];
     s+=nr[nrr];
    }
    else
    {
     nr[nrr]=nr[nrr-1];
     s+=nr[nrr-1];
    }
   }
 n=nrr;
}

void pas()
{
 if(suma<=s)
  if(alege[suma])
   while(suma)
   {
    cnt++;
    alese[cnt]=alege[suma];
    suma=suma-alege[suma];
   }
}

void alg()
{
 long i,j;

 for(i=1;i<=n;i++)
 {
  sume1[nr[i]]=1;

  for(j=1;j<=s;j++)
   if(sume[j]==1)
    sume1[j+nr[i]]=1;

  for(j=1;j<=s;j++)
   if(sume1[j]==1 && sume[j]==0)
   {
    sume[j]=1;
    alege[j]=nr[i];
    sume1[j]=0;
   }
 }
}

void afis()
{
 long i;

 if(cnt==0 || cate!=6)
 {
  fout<<"-1"<<endl;
  return ;
 }

 for(i=1;i<=cnt;i++)
  if(alese[i]!=-32000)
   fout<<alese[i]<<" ";
}

void procesez()
{
 long i,j;
 cate=cnt;

 for(i=1;i<=cnt;i++)
  for(j=i+1;j<=cnt;j++)
   if(verif(alese[i]+alese[j])==1)
   {
    alese[i]+=alese[j];
    alese[j]=-32000;
    cate--;

    if(cate==6)
     return;
   }
}

int verif(long val)
{
 long i;

 for(i=1;i<=n;i=i+6)
  if(nr[i]==val)
   return 1;
 return 0;
}