Cod sursa(job #18405)

Utilizator h_istvanHevele Istvan h_istvan Data 18 februarie 2007 11:59:39
Problema Tricouri Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 9-a si gimnaziu Marime 2.98 kb
#include <fstream.h>
#include <iostream.h>

long int n,m;
long int v[300001];
struct adat
{
       long int buline;
       short int tricouri;
       long int v[6];
       adat* kov;
};
adat *elso;

void betesz(long int buline,short int tricouri,long int nrt)
{
     adat *p = new adat;
     p -> buline = buline;
     p -> tricouri = tricouri;
     p -> v[tricouri] = nrt;
     if (elso == NULL)
     {
        elso = p;
        elso->kov = NULL;
     }
     else if(p->buline <= elso->buline)
     {
          if (p->buline < elso->buline)
          {
             p->kov = elso;
             elso = p;
          }
          else
          {
              if (p->tricouri < elso->tricouri)
              {
                 elso->tricouri=p->tricouri;               
              }
          }
     }
     else
     {
         adat *a;
         a = elso;
         while ((a->kov != NULL) && (a->kov->buline < p->buline))
         {
               a=a->kov;
         }
         if (a->kov == NULL)
         {
            a->kov=p;
            p->kov=NULL;
         }
         else if (a->kov->buline > p->buline)
         {
            p->kov = a->kov;
            a->kov = p;
         }
         else
         {
             if (a->kov->tricouri > p->tricouri)
             {
                a->kov->tricouri = p->tricouri;
             }
         }
     }
}

void torol()
{
     adat *p = elso;
     while (p != NULL)
     {
           p=elso->kov;
           delete elso;
           elso = p;        
     }
}

long int keres(int k,int p)
{
     long int i,j,max;
     bool control;
     
     for (i=1;i<=n;i++)
     {
         betesz(v[i],1,i);               
     }
     
     adat *a = elso;
     
     while (a != NULL)
     {
           if (a -> tricouri < k)
           {
              for (i=1;i<=n;i++)
              {
                  control=true;
                  for(j=1;j<=a->tricouri;j++)
                  {
                     if(a->v[j]==i) control=false;
                  }
                  if(control) betesz(a->buline+v[i],a->tricouri+1,i);           
              }            
           }
           a = a -> kov;
     }
     a = elso;
     max = -1;
     
     while (a != NULL)
     {
             if  ((a->buline % p == 0) && (a->tricouri == k))
                 max = a->buline;             
             a = a->kov;
     }
     
     a=elso;
     while (a!=NULL)
     {
           cout << a->buline << " ";
           a = a -> kov;
     }
     cout << endl;
     
     torol();
     
     
     return max;
}

int main()
{  
   long int i;
   short int k,p;
     
   ifstream in; 
   ofstream out;
   in.open("tricouri.in");
   out.open("tricouri.out");
   in >> n >> m;
   
   for (i=1;i<=n;i++)
   {
       in >> v[i];
   }
   
   for (i=1;i<=m;i++)
   {
       in >> k >> p;
       out << keres(k,p) << endl;
   }
   
   in.close();
   out.close();
}