这好样的题目,还有什么奇葩的点啊才92
/*
11/19/2024
我错把风云入墨,写尽一生都是错
始终等不来一场雨淋湿你我
那年你江南路过,我不该把月色惹
便不会如此难以割舍
我错把风云入墨,写尽一生都是错
缘分难勾勒,在纸上,斑驳你我
你转身远赴山河,恰如人间惊鸿客
/////////////如听仙乐耳暂明//////////////
*/
#include<bits/stdc++.h>
using namespace std;
/*
1 17
7 3
4 2
5 2
10 1
10 3
3 3
13 4
4 4
7 2
0 2
4 1
13 3
7 4
4 3
10 4
5 4
0 1
00 3 4444 55 777 101010 1313
*/
int T, n, ans;
int p[55];
void dfs(int times, int k1, int k2, int k3){
if (times >= ans) return ;
int kk = 0;
//三顺子
for (int i = 3; i <= 14; i ++){
if (p[i] >= 3){
kk ++;
if (kk >= 2){
for (int j = i; j >= i - kk + 1; j --) p[j] -= 3;
dfs(times + 1, k1, k2, k3);
for (int j = i; j >= i - kk + 1; j --) p[j] += 3;
}
}else kk = 0;
}
kk = 0;
//双顺子
for (int i = 3; i <= 14; i ++){
if (p[i] >= 2){
kk ++;
if (kk >= 3){
for (int j = i; j >= i - kk + 1; j --) p[j] -= 2;
dfs(times + 1, k1, k2, k3);
for (int j = i; j >= i - kk + 1; j --) p[j] += 2;
}
}else kk = 0;
}
kk = 0;
//单顺子
for (int i = 3; i <= 14; i ++){
if (p[i] >= 1){
kk ++;
if (kk >= 5){
for (int j = i; j >= i - kk + 1; j --) p[j] -= 1;
dfs(times + 1, k1, k2, k3);
for (int j = i; j >= i - kk + 1; j --) p[j] += 1;
}
}else kk = 0;
}
//三带
for (int i = 2; i <= 14; i ++){
if (p[i] == 3){
p[i] -= 3;
dfs(times + 1, k1 + 1, k2, k3);
dfs(times + 1, k1, k2 + 1, k3);
p[i] += 3;
}
}
//四带
for (int i = 2; i <= 14; i ++){
if (p[i] == 4){
p[i] -= 4;
dfs(times + 1, k1, k2, k3 + 2);
dfs(times + 1, k1, k2 + 2, k3);
p[i] += 4;
}
}
//剩下的单牌(单和对)
int r1 = p[0], r2 = 0;
for (int i = 2; i <= 14; i ++){
if (p[i] == 1) r1 ++;
if (p[i] >= 2) r2 ++;
}
while (k3 >= 2 && r2 >= 2) k3 -= 2, r2 -= 2;
while (k3 >= 2 && r1 >= 2) k3 -= 2, r1 -= 2;
if (p[0] == 2 && r1 - k1 >= 2) r1 --;
ans = min(ans, times + max(r1 - k1, 0) + max(r2 - k2, 0));
}
int main(){
cin >> T >> n;
while (T --){
memset(p, 0, sizeof(p));
int kk; ans = n;
for (int i = 1; i <= n; i ++){
scanf("%d", &kk);
if (kk == 1) kk = 14;
p[kk] ++;
scanf("%d", &kk);
}
dfs(0, 0, 0, 0);
// cout << "------------------------\n";
cout << ans << endl;
// cout << "------------------------\n";
}
return 0;
}