Cod sursa(job #26471)

Utilizator stef2nStefan Istrate stef2n Data 5 martie 2007 17:26:33
Problema Balanta Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.37 kb
#include <stdio.h>
#include <stdlib.h>

#define infile "balanta.in"
#define outfile "balanta.out"
#define NMAX 1030
#define CANT_MAX 1030
#define EGAL (int)('0')
#define LEFT (int)('1')
#define RIGHT (int)('2')
struct oper {short int k; char rez; short int left[NMAX/2], right[NMAX/2];};

FILE *fin,*fout;
int n,m;
oper op[CANT_MAX];
bool mic[NMAX],mare[NMAX];

void citire()
  {
   int i,j;
   fin=fopen(infile,"r");
   fscanf(fin,"%d %d",&n,&m);
   for(i=0;i<m;i++)
      {
       fscanf(fin,"%d ",&op[i].k);
       for(j=0;j<op[i].k;j++)
          fscanf(fin,"%d ",&op[i].left[j]);
       for(j=0;j<op[i].k;j++)
          fscanf(fin,"%d ",&op[i].right[j]);
       fscanf(fin,"%c",&op[i].rez);
      }
   fclose(fin);
  }

int verifica_mic(int x)
  {
   int i,j,gasit;
   for(i=0;i<m;i++)
      switch(op[i].rez)
            {
             case EGAL:  for(j=0;j<op[i].k;j++)
                            if(op[i].left[j]==x)
                              return 0;
                         for(j=0;j<op[i].k;j++)
                            if(op[i].right[j]==x)
                              return 0;
                         break;
             case LEFT:  gasit=0;
                         for(j=0;(j<op[i].k)&&!gasit;j++)
                            if(op[i].right[j]==x)
                              gasit=1;
                         if(!gasit)
                           return 0;
                         break;
             case RIGHT: gasit=0;
                         for(j=0;(j<op[i].k)&&!gasit;j++)
                            if(op[i].left[j]==x)
                              gasit=1;
                         if(!gasit)
                           return 0;
                         break;
            }
   return 1;
  }

int verifica_mare(int x)
  {
   int i,j,gasit;
   for(i=0;i<m;i++)
      switch(op[i].rez)
            {
             case EGAL:  for(j=0;j<op[i].k;j++)
                            if(op[i].left[j]==x)
                              return 0;
                         for(j=0;j<op[i].k;j++)
                            if(op[i].right[j]==x)
                              return 0;
                         break;
             case LEFT:  gasit=0;
                         for(j=0;(j<op[i].k)&&!gasit;j++)
                            if(op[i].left[j]==x)
                              gasit=1;
                         if(!gasit)
                           return 0;
                         break;
             case RIGHT: gasit=0;
                         for(j=0;(j<op[i].k)&&!gasit;j++)
                            if(op[i].right[j]==x)
                              gasit=1;
                         if(!gasit)
                           return 0;
                         break;
            }
   return 1;
  }

void first_strategy() // moneda falsa are greutate mai mica
  {
   int i;
   for(i=1;i<=n;i++)
      mic[i]=verifica_mic(i);
  }

void second_strategy() // moneda falsa are greutate mai mare
  {
   int i;
   for(i=1;i<=n;i++)
      mare[i]=verifica_mare(i);
  }

void solution(int x)
  {
   fout=fopen(outfile,"w");
   fprintf(fout,"%d\n",x);
   fclose(fout);
   exit(0);
  }


int main()
{
int i,count,poz;
citire();
first_strategy();
second_strategy();
for(i=1;i<=n;i++)
   mic[i] = mic[i] || mare[i];
count=0;
for(i=1;i<=n;i++)
   if(mic[i])
     if(count)
       solution(0);
     else
       {
        count++;
        poz=i;
       }
if(count)
  solution(poz);
else
  solution(0);
return 0;
}