Cod sursa(job #249914)

Utilizator scvalexAlexandru Scvortov scvalex Data 29 ianuarie 2009 15:46:20
Problema Cutii Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int a, b, c;
} Cutie;

int N;
Cutie cs[3500];
int ms[3500], Ms[3500];

int ccmp(const void *_x, const void *_y) {
	Cutie *x = (Cutie*)_x, *y = (Cutie*)_y;

	if ((x->a == y->a) && (x->b == y->b)) {
		return (x->c - y->c);
	} else if (x->a == y->a) {
		return (x->b - y->b);
	}
	return (x->a - y->a);
}

int fits(int i, int j) {
	return ((cs[i].a < cs[j].a) && (cs[i].b < cs[j].b) && (cs[i].c < cs[j].c));
}

void swap(int *x, int *y) {
	int aux = *x;
	*x = *y;
	*y = aux;
}

void calcMs() {
	int m, i, j;
	ms[0] = 1;
	Ms[0] = 1;
	for (i = 1; i < N; ++i) {
		m = 0;
		for (j = i-1; j >= 0; --j) {
			if (fits(j, i) && (ms[j] > m))
				m = ms[j];
			if (m > Ms[j])
				break;
		}
		ms[i] = m+1;
		Ms[i] = Ms[i-1];
		if (m+1 > Ms[i])
			Ms[i] = m+1;
	}
}

int main(int argc, char *argv[]) {
	int T, i;

	FILE *fi = fopen("cutii.in", "r");
	fscanf(fi, "%d %d", &N, &T);
	FILE *fo = fopen("cutii.out", "w");
	while (T--) {
		for (i = 0; i < N; ++i) {
			fscanf(fi, "%d %d %d", &(cs[i].a), &(cs[i].b), &(cs[i].c));
			if (cs[i].a > cs[i].b)
				swap(&(cs[i].a), &(cs[i].b));
			if (cs[i].a > cs[i].c)
				swap(&(cs[i].a), &(cs[i].c));
			if (cs[i].b > cs[i].c)
				swap(&(cs[i].b), &(cs[i].c));
		}

		qsort(cs, N, sizeof(cs[0]), ccmp);

		calcMs();

		/* for (i = 0; i < N; ++i)
			printf("%d %d %d\n", cs[i].a, cs[i].b, cs[i].c);
		printf("\n");
		printf("%d\n\n", m); */
		fprintf(fo, "%d\n", Ms[N-1]);
	}
	fclose(fo);
	fclose(fi);

	return 0;
}