```cpp
#include<iostream>
#include<cstdlib>
using namespace std;
inline int read(){
int re=0;
char t=getchar();
while(t>'9'||t<'0')t=getchar();
while(t>='0'&&t<='9')re=(re<<3)+(re<<1)+(t^48),t=getchar();
return re;
}
int card[20],ans;
void clear(){
for(int i=0;i<19;i++)card[i]=0;
ans=0;
}
int sanshunzi(int x){
int cnt=0;
for(int i=x;i<=14;i++){
if(card[i]>=3)cnt++;
else break;
}
return cnt>1?cnt:0;
}
int shuangshunzi(int x){
int cnt=0;
for(int i=x;i<=14;i++){
if(card[i]>=2)cnt++;
else break;
}
return cnt>2?cnt:0;
}
int danshunzi(int x){
int cnt=0;
for(int i=x;i<=14;i++){
if(card[i]>=1)cnt++;
else break;
}
return cnt>4?cnt:0;
}
int sanpai(){
int zha=0,san=0,dui=0,dan=0,king=card[0];
bool four=false,three=false;
int re=0;
for(int i=3;i<=15;i++){
if(card[i]==1)dan++;
else if(card[i]==2)dui++;
else if(card[i]==3)san++;
else if(card[i]==4)zha++;
}
for(int i=1;i<=zha;i++){
if(dan>=2)dan-=2,re++;
else if(dui>=2)dui-=2,re++;
else if(dan==1)dan--,re++;
else if(dui==1)dui--,re++;
else re++,four=true;
}
for(int i=1;i<=san;i++){
if(dan>=1)dan--,re++;
else if(dui>=1)dui--,re++;
else re++,three=true;
}
re=re+dan+dui;
if(four)king=0;
else if(three&&king>=1)king--;
re+=(king?1:0);
return re;
}
bool check(){
for(int i=0;i<=15;i++){
if(card[i]!=0)return false;
}return true;
}
void dfs(int depth){
if(depth+1>=ans)return;
for(int i=3;i<=13;i++){
int ssz=sanshunzi(i);
if(ssz==0)continue;
for(int sz=2;sz<=ssz;sz++){
for(int j=i;j<=i+sz-1;j++)card[j]-=3;
dfs(depth+1);
for(int j=i;j<=i+sz-1;j++)card[j]+=3;
}
}
for(int i=3;i<=12;i++){
int ssz=shuangshunzi(i);
if(ssz==0)continue;
for(int sz=3;sz<=ssz;sz++){
for(int j=i;j<=i+sz-1;j++)card[j]-=2;
dfs(depth+1);
for(int j=i;j<=i+sz-1;j++)card[j]+=2;
}
}
for(int i=3;i<=10;i++){
int dsz=danshunzi(i);
if(dsz==0)continue;
for(int sz=5;sz<=dsz;sz++){
for(int j=i;j<=i+sz-1;j++)card[j]--;
dfs(depth+1);
for(int j=i;j<=i+sz-1;j++)card[j]++;
}
}
int sp=sanpai();
ans=min(ans,depth+sp);
return;
}
int main(){
int T=read(),n=read();
for(int t=1;t<=T;t++){
clear();
for(int i=1;i<=n;i++){
int x=read(),y=read();
if(x==1)x=14;
else if(x==2)x=15;
card[x]++;
}
ans=n;
dfs(0);
cout<<ans<<endl;
}
}
```
代码如此
by WannaYellow @ 2022-06-10 21:51:36