#include #include struct tag_pupil { int height; int sex; char music[101]; char sport[101]; }; typedef struct tag_pupil PUPIL; PUPIL males[500]; PUPIL females[500]; int males_size; int females_size; int p_size; int edges[500][500]; int e_size[500]; int mark[500]; int males_match[500]; int females_match[500]; int dfs(int i) { int e, j; int next; if( mark[i] ){ return 0; } /* mark */ mark[i] = 1; for(e = 0; e < e_size[i]; e++) { j = edges[i][e]; next = females_match[j]; if( next == i ){ continue; } if( next == -1 || dfs(next) ){ males_match[i] = j; females_match[j] = i; return 1; } } return 0; } int main(){ int cases; int c, i, j, e; int n; int changed; int height, sex; char sex_string[16]; PUPIL *p, *q; scanf("%d", &cases); for(c = 0; c < cases; c++) { scanf("%d", &n); /* input */ males_size = 0; females_size = 0; for(p_size = 0; p_size < n; p_size++) { scanf("%d", &height); scanf("%s", &sex_string); sex = strcmp(sex_string, "M") == 0; if( sex ){ /* male */ p = &males[males_size++]; }else{ /* female */ p = &females[females_size++]; } p->height = height; p->sex = sex; scanf("%s", p->music); scanf("%s", p->sport); } /* graph construct */ for(i = 0; i < males_size; i++) { e_size[i] = 0; } for(i = 0; i < males_size; i++) { p = &males[i]; for(j = 0; j < females_size; j++) { q = &females[j]; if( !strcmp(p->music, q->music) && strcmp(p->sport, q->sport) && abs(p->height-q->height) <= 40 ){ /* coupable */ edges[i][e_size[i]++] = j; } } } /* init matching */ for(i = 0; i < males_size; i++) { males_match[i] = -1; } for(j = 0; j < females_size; j++) { females_match[j] = -1; } do{ changed = 0; for(i = 0; i < males_size; i++) { mark[i] = 0; } for(i = 0; i < males_size; i++) { if( males_match[i] != -1 ) { /* has matching */ continue; } if( dfs(i) ) { changed = 1; } } }while(changed); j = 0; for(i = 0; i < males_size; i++) { if( males_match[i] != -1 ) { j++; } } printf("%d\n", n - j); } return 0; }