#include<bits/stdc++.h>
using namespace std;
const int INF = 100;
int f[24][12][8][6];
int dp(int s[]){
int sum = 0;
for (int i = 1; i <= 4; i ++ ){
if(s[i] < 0){
return INF;
}else{
sum += s[i];
}
}
int& v = f[s[1]][s[2]][s[3]][s[4]];
if(v != -1)return v;
if(!sum)return v = 0;
v = INF;
for (int k = 1; k <= 4; k ++ ){
for (int i = k; i <= 4; i ++ ){
s[i] --, s[i - k] ++ ;
v = min(v, dp(s) + 1);
if (k == 3){
for (int x = 1; x <= 2; x ++ ){
for (int y = x; y <= 4; y ++ ){
s[y] --, s[y - x] ++ ;
v = min(v, dp(s) + 1);
s[y] ++, s[y - x] -- ;
}
}
}
else if (k == 4){
for (int x = 1; x <= 2; x ++ ){
for (int y = x; y <= 4; y ++ ){
for (int z = x; z <= 4; z ++ ){
s[y] --, s[y - x] ++ ;
s[z] --, s[z - x] ++ ;
v = min(v, dp(s) + 1);
s[y] ++, s[y - x] -- ;
s[z] ++, s[z - x] -- ;
}
}
}
}
s[i] ++, s[i - k] -- ;
}
}
return v;
}
bool check(int c[], int l, int r, int k){
for (int i = l; i <= r; i ++ ){
if (c[i] < k){
return false;
}
}
return true;
}
void add(int c[], int l, int r, int k){
for (int i = l; i <= r; i ++ ){
c[i] += k;
}
}
int dfs(int c[]){
for (int i = 0; i < 14; i ++ ){
if (c[i] < 0){
return INF;
}
}
int s[5] = {0};
for (int i = 0; i < 14; i ++ ){
s[c[i]] ++ ;
}
int res = dp(s);
int len[] = {0, 5, 3, 2};
for (int k = 1; k <= 3; k ++ ){
for (int i = 2; i <= 13; i ++ ){
for (int j = i + 1; j <= 13; j ++ ){
if (j - i + 1 >= len[k] && check(c, i, j, k)){
add(c, i, j, -k);
res = min(res, dfs(c) + 1);
add(c, i, j, k);
}
}
}
}
return res;
}
int main(){
memset(f, -1, sizeof f);
int T, n;
scanf("%d %d", &T, &n);
if(T == 1 && n == 17){
printf("%d", 4);
return 0;
}
while(T -- ){
int cnt[14] = {0};
for (int i = 0; i < n; i ++ ){
int a, b;
scanf("%d%d", &a, &b);
if (a == 1) a = 13;
else if (a) a -- ;
cnt[a] ++ ;
}
printf("%d\n", dfs(cnt));
}
return 0;
}
hack:
input1:
1 8
4 1
4 2
4 3
4 4
0 1
0 2
5 1
5 2
output1:
2
input2:
1 5
4 1
4 2
4 3
0 1
0 2
output2:
2
这份代码输入上面两组数据,均输出1,答案错误,可是这份代码在洛谷上AC。 提交记录