Cod sursa(job #564582)

Utilizator eukristianCristian L. eukristian Data 27 martie 2011 10:50:47
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#include <cstdlib>

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

int compare(const void* a, const void *b)
{
	cutie *a1 = (cutie*)a;
	cutie *b1 = (cutie*)b;
	if (a1->x != b1->x)
		return a1->x - b1->x;
	if (a1->y != b1->y)
		return a1->y - b1->y;
	if (a1->z != b1->z)
		return a1->z - b1->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;
	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; k >= 1 ; --k)
				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;
}