Cod sursa(job #8262)

Utilizator stef2nStefan Istrate stef2n Data 23 ianuarie 2007 23:49:55
Problema Aprindere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#include <stdlib.h>

#define infile "aprindere.in"
#define outfile "aprindere.out"
struct NOD{short int x; NOD *adr;};
struct comutator{short int camera,timp; NOD *next;};

FILE *fin,*fout;
int n,nrcomut;
comutator a[1005];
char stare[1005];
int timptotal;

inline void adaug_st(NOD *(&prim), int x)
  {
   NOD *a=new NOD;
   a->x=x;
   a->adr=prim;
   prim=a;
  }

void citire()
  {
   int i,j,k,c;
   fin=fopen(infile,"r");
   fscanf(fin,"%d %d",&n,&nrcomut);
   for(i=0;i<n;i++)
      fscanf(fin,"%d",&stare[i]);
   for(i=0;i<nrcomut;i++)
      {
       fscanf(fin,"%d %d %d",&a[i].camera,&a[i].timp,&k);
       a[i].next=NULL;
       for(j=0;j<k;j++)
          {
           fscanf(fin,"%d",&c);
           adaug_st(a[i].next,c);
          }
      }
   fclose(fin);
  }

inline int cmp(const void *ma, const void *mb)
  {
   comutator a=*((comutator *)ma);
   comutator b=*((comutator *)mb);
   return -(a.camera<b.camera)+(a.camera>b.camera);
  }

void solve()
  {
   int i;
   NOD *b;
   for(i=0;i<nrcomut;i++)
      if(!stare[a[i].camera])
        {
         timptotal+=a[i].timp;
         b=a[i].next;
         while(b)
             {
              stare[b->x]=!stare[b->x];
              b=b->adr;
             }
        }
  }


int main()
{
citire();
qsort(a,nrcomut,sizeof(comutator),cmp);
timptotal=0;
solve();
fout=fopen(outfile,"w");
fprintf(fout,"%d\n",timptotal);
fclose(fout);
return 0;
}