#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n, ans, p[15], L[4]; void Dfs(int dep, int k) { if(!k) { ans = min(ans, dep); return ; } if(dep >= ans) return ; for(int i = 0; i < 13; i++) if(p[i] == 3) { p[i] -= 3; Dfs(dep+1, k-3); for(int j = 0; j < 15; j++) if(p[j] && j!=i) { p[j]--; Dfs(dep+1, k-4); if(p[j]) { p[j]--; Dfs(dep+1, k-5); p[j]++; } p[j]++; } p[i] += 3; } for(int i = 0; i < 13; i++) if(p[i] == 4) { p[i] -= 4; Dfs(dep+1, k-4); for(int j = 0; j < 13; j++) if(p[j]) { p[j]--; for(int t = j; t < 13; t++) if(p[t]) { p[t]--; Dfs(dep+1, k-6); p[t]++; } p[j]++; } for(int j = 0; j < 13; j++) if(p[j]>1) { p[j] -= 2; for(int t = j; t < 13; t++) if(p[t]>1) { p[t] -= 2; Dfs(dep+1, k-8); p[t] += 2; } p[j] += 2; } p[i] += 4; } for(int i = 0; i < 13; i++) { dep += (p[i]/2) + (p[i]%2); if(dep >= ans) return ; } if(p[13] == 1 || p[14] == 1) dep++; ans = min(ans, dep); } void Solve(int dep, int k) { if(!k) { ans = min(ans, dep); return ; } if(dep >= ans) return ; for(int t = 1; t <= 3; t++) for(int i = 0; i < 13-L[t]; i++) if(p[i] >= t) { int len = 1, j; for(j = i+1; j < 12; j++) if(p[j] < t) break; else len++; if(len < L[t]) { i = j; continue; } for(j = i; j < i+len; j++) p[j] -= t; for(j = len; j >= L[t]; j--) { Solve(dep+1,k-t*j); p[i+j-1] += t; } for(j = i; j < i+L[t]-1; j++) p[j] += t; } Dfs(dep, k); } int main() { int T; scanf("%d%d",&T,&n); L[1] = 5,L[2] = 3,L[3] = 2; while(T--) { memset(p, 0, sizeof(p)); for(int i = 1; i <= n; i++) { int c, c2; scanf("%d%d",&c,&c2); if(c > 2) c -= 3; else if(!c) c = 12+c2; else c += 10; p[c]++; } ans = n; Solve(0, n); printf("%d\n", ans); } return 0; }