Cod sursa(job #129450)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 29 ianuarie 2008 15:30:57
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include<fstream.h>   
long a[110],T,x,unu[110];   
ofstream fout("loto.out");   
short n;   
void citire(){   
ifstream fin("loto.in");   
fin>>n>>T;   
for (short i=0;i<n;i++)   
  fin>>a[i];   
fin.close();   
}   
void bule(long zero[],long unu[]){   
for(short j=0;j<26;j++) {   
   short nr0=0,nr1=0;   
for(long i=0;i<n;i++)   
    if((zero[i]&(1<<j))!=0)   
       unu[nr1++]=zero[i];   
    else  
       zero[nr0++]=zero[i];   
    nr1=0;   
    for(short k=nr0;k<n;k++)   
       zero[k]=unu[nr1++];   
}   
}   
int caut(long x){   
int st=0,dr=n-1,m;   
while (st<dr){   
m=(st+dr)/2;   
if (a[m]==x)   
    return 1;   
    else  
    if (a[m]<x)   
       st=m+1;   
       else dr=m-1;}   
return 0;   
}   
int parc(){   
long S,nr=0,nr1=0,nr2,nr3;   
double T1=T;   
double ww=T1/6;   
if (T/6==ww) {   
   for (int i=0;i<n;i++)   
      if (a[i]==ww){   
     for (int tt=0;tt<6;tt++)   
        fout<<a[i]<<" ";   
     return 1;}   
   }   
for (int pp=n-1;pp>=0;pp--)   
   if (a[pp]*6>T)   
      nr++;   
for (int pu=0;pu<n;pu++)   
   if (a[pu]*6<T)   
      nr2++;   
for (int yy=0;yy<n;yy++)   
    if (a[yy]*5+a[n-nr2-1]<T)   
    nr3++;   
for (int qq=n-1;qq>=0;qq--)   
   if (a[qq]*5+a[n-1-nr]>T)   
     nr1++;   
for (short i=n-1-nr;i>=0;i--)   
for (short j=n-1;j>=nr2-1;j--)   
for (short k=n-1-nr1;k>=0;k--)   
for (short l=n-1;l>=nr3-1;l--)   
for (short o=n-1;o>=0;o--)   
   if (caut(T-a[i]-a[j]-a[k]-a[l]-a[o])==1){   
    fout<<a[i]<<" "<<a[j]<<" "<<a[k]<<" "<<a[l]<<" "<<a[o]<<" "<<T-a[i]-a[j]-a[k]-a[l]-a[o]<<"\n";   
    return 1;}   
return 0;   
}   
int main(){   
citire();   
bule(a,unu);   
if (parc()==0)   
  fout<<"-1";   
return 0;   
}  
#include<fstream.h>
long a[110],T,x,unu[110];
ofstream fout("loto.out");
short n;
void citire(){
ifstream fin("loto.in");
fin>>n>>T;
for (short i=0;i<n;i++)
  fin>>a[i];
fin.close();
}
void bule(long zero[],long unu[]){
for(short j=0;j<26;j++) {
   short nr0=0,nr1=0;
for(long i=0;i<n;i++)
	if((zero[i]&(1<<j))!=0)
	   unu[nr1++]=zero[i];
	else
	   zero[nr0++]=zero[i];
	nr1=0;
	for(short k=nr0;k<n;k++)
	   zero[k]=unu[nr1++];
}
}
int caut(long x){
int st=0,dr=n-1,m;
while (st<dr){
m=(st+dr)/2;
if (a[m]==x)
    return 1;
    else
    if (a[m]<x)
       st=m+1;
       else dr=m-1;}
return 0;
}
int parc(){
long S,nr=0,nr1=0,nr2,nr3;
double T1=T;
double ww=T1/6;
if (T/6==ww) {
   for (int i=0;i<n;i++)
      if (a[i]==ww){
	 for (int tt=0;tt<6;tt++)
	    fout<<a[i]<<" ";
	 return 1;}
   }
for (int pp=n-1;pp>=0;pp--)
   if (a[pp]*6>T)
      nr++;
for (int pu=0;pu<n;pu++)
   if (a[pu]*6<T)
      nr2++;
for (int yy=0;yy<n;yy++)
    if (a[yy]*5+a[n-nr2-1]<T)
	nr3++;
for (int qq=n-1;qq>=0;qq--)
   if (a[qq]*5+a[n-1-nr]>T)
     nr1++;
for (short i=n-1-nr;i>=0;i--)
for (short j=n-1;j>=nr2-1;j--)
for (short k=n-1-nr1;k>=0;k--)
for (short l=n-1;l>=nr3-1;l--)
for (short o=n-1;o>=0;o--)
   if (caut(T-a[i]-a[j]-a[k]-a[l]-a[o])==1){
    fout<<a[i]<<" "<<a[j]<<" "<<a[k]<<" "<<a[l]<<" "<<a[o]<<" "<<T-a[i]-a[j]-a[k]-a[l]-a[o]<<"\n";
    return 1;}
return 0;
}
int main(){
citire();
bule(a,unu);
if (parc()==0)
  fout<<"-1";
return 0;
}