Cod sursa(job #564551)

Utilizator eukristianCristian L. eukristian Data 27 martie 2011 10:43:12
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <cstdlib>

struct cutie
{
	int x;
	int y;
	int z;
};

int compare(const void* a, const void *b)
{
	if ((cutie*)a->x != (cutie*)b->x)
		return (cutie*)a->x - (cutie*)b->x;
	if ((cutie*)a->y != (cutie*)b->y)
		return (cutie*)a->y - (cutie*)b->y;
	if ((cutie*)a->z != (cutie*)b->z)
		return (cutie*)a->z - (cutie*)b->z;
	return 0;
}

bool incape(cutie *a, cutie *b)
{
	return a->x < b->x && a->y < b->y && a->z < b->z;
}

int main()
{
	int N, T, myMax = 0;
	cutie *mat;
	int *dyn;
	FILE *f = fopen("cutii.in", "r");
	FILE *g = fopen("cutii.out", "w");
	
	fscanf(f,"%d %d\n", &N, &T);
	mat = new cutie[N + 1];
	dyn = new int[N + 1];
	
	for (int i = 0 ; i < T ; ++i)
	{
		myMax = 1;
		for (int j = 1 ; j <= N ; ++j)
			fscanf(f, "%d %d %d",&mat[j].x, &mat[j].y, &mat[j].z);
		
		qsort(mat + 1, N, sizeof(cutie), compare);
		
		dyn[1] = 1;
		for (int j = 2 ; j <= N ; ++j)
		{
			int max = 0;
			for (int k = j - 1; j >= 1 ; --j)
				if (incape(&mat[k], &mat[j] && (max == 0 || dyn[max] < dyn[k])))
					max = k;
			
			if (max != 0)
				dyn[j] = dyn[max] + 1;
			else
				dyn[j] = 1;
			
			if (dyn[j] > myMax)
				myMax = dyn[j];
		}
		
		fprintf(g, "%d\n", myMax);
	}
	
	
	delete[] mat;
	return 0;
}