Cod sursa(job #64785)

Utilizator FlorianFlorian Marcu Florian Data 5 iunie 2007 17:25:57
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>
#include<stdlib.h>
typedef struct
        {
        long i,j,k;
        }element;
element x[4000],c[4000];
int cmp(const void*a, const void*b)
        {
        long int x=*(long int*)a,y=*(long int*)b;
        if(c[x].i==c[y].i &&c[x].j==c[y].j) return c[x].k-c[y].k;
        else if (c[x].i==c[y].i) return c[x].j-c[y].j;
        else return c[x].i-c[y].i;
        }
int main()
{int ord[4000],n,t,aux,i,ok,p,k,j,ii,l[3502],q[3502],max,r,jj;
FILE*f=fopen("cutii.in","r");
FILE*g=fopen("cutii.out","w");
fscanf(f,"%d %d",&n,&t);
for (r=1;r<=t;r++)
{  ii=0;
for (i=1; i<=n;i++)   fscanf(f,"%d %d %d",&c[i].i,&c[i].j,&c[i].k);
        for(jj=1;jj<=n;++jj) ord[jj]=jj;
        qsort(ord,n+1,sizeof(long int),cmp);
        for(jj=1;jj<=n;++jj)
                {
                x[jj].i=c[ord[jj]].i;
                x[jj].j=c[ord[jj]].j;
                x[jj].k=c[ord[jj]].k;
                }
        q[n]=0; l[n]=1;
         for (i=n-1; i>=1;i--)
                        {
                        max=0; k=0;
                        for (j=i+1; j<=n;j++)
       if (x[i].i<x[j].i&&l[j]>max&&x[i].j<x[j].j&&x[i].k<x[j].k) {max=l[j]; k=j;}
                        l[i]=max+1;
                        q[i]=k;
                        }
max=0;
for (i=1;i<=n;i++) if (l[i]>max) {max=l[i]; p=i;}
ii=0;
while (p!=0)
   {
   ii++;
   p=q[p];
    }
fprintf(g,"%d\n",ii);}
fclose(f);
fclose(g);
return 0;}