Cod sursa(job #47348)

Utilizator arenakadaffKadaff arenakadaff Data 3 aprilie 2007 16:46:42
Problema Cutii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>


struct cut{
int x , y , z ; } tab[3500] ;

long long v[3500] ;
int c[3500] ;

void quicksort(int i , int j)
{
	if(i < j)
	{
		int st = i - 1 , dr = j ;
		long piv = v[j] , t ;
		struct cut tmp ;
		for( ; ; )
		{
			while(v[++st] > piv) ;
			while(v[--dr] < piv) ;
			if(st > dr) break ;
			t = v[st] ;
			tmp = tab[st] ;
			v[st] = v[dr] ;
			tab[st] = tab[dr] ;
			v[dr] = t ;
			tab[dr] = tmp ;
		}
		t = v[st] ;
		tmp = tab[st] ;
		v[st] = v[j] ;
		tab[st] = tab[j] ;
		v[j] = t ;
		tab[j] = tmp ;
		quicksort(i , st - 1) ;
		quicksort(st , j) ;
	}
}


int main()
{
	int i , j , t , n , max ;
	FILE *in , *out ;
	in = fopen("cutii.in" , "rt") ;
	out = fopen("cutii.out" , "wt") ;
	fscanf(in , "%d %d" , &n , &t) ;
	while(t--)
	{
		for(i = 0 ; i < n ; i++)
		{
			fscanf(in , "%d %d %d" , &tab[i].x , &tab[i].y , &tab[i].z) ;
			v[i] = tab[i].x * tab[i].y * tab[i].z ;
		}
		quicksort(0 , n-1) ;
		for(i = 0 ; i < n ; i++) c[i] = 1 ;
		max = 0 ;
		for(i = n - 2 ; i >= 0 ; i--) for(j = i + 1 ; j < n ; j++) if((tab[i].x > tab[j].x && tab[i].y > tab[j].y && tab[i].z > tab[j].z) && (c[i] < c[j] + 1))
		{
			c[i] = c[j] + 1 ;
			if(c[i] > max) max = c[i] ;
		}
		fprintf(out , "%d\n" , max) ;
	}
	fclose(in) ;
	fclose(out) ;
	return 0 ;
}