样例都过了,但是飘零。 求dalao帮改一下
#include<bits/stdc++.h>
using namespace std;
int card[20],ans=1e9;
void cp(int step,int num){
//cout<<step<<" "<<num<<"\n";
if(step>=ans)return;
if(num<=0){
ans=min(step,ans);
return;
}
//4带2(对)
for(int i=1;i<=13;i++){
if(card[i]>=4){
card[i]-=4;
for(int j=0;j<=13;j++){
if(card[j]>=2){
card[j]-=2;
for(int k=0;k<=13;k++){
if(card[k]>=2){
card[k]-=2;
cp(step+1,num-8);
card[k]+=2;
}
}
card[j]+=2;
}
}
card[i]+=4;
}
}
//4带2(单)
for(int i=1;i<=13;i++){
if(card[i]>=4){
card[i]-=4;
for(int j=0;j<=13;j++){
if(card[j]>=1){
card[j]-=1;
for(int k=0;k<=13;k++){
if(card[k]>=1){
card[k]-=1;
cp(step+1,num-6);
card[k]+=1;
}
}
card[j]+=1;
}
}
card[i]+=4;
}
}
//单顺子
for(int i=1;i<=8;i++){
if(card[i]){
int a=i,zs=1;
card[i]--;
int cnt=1;
for(int j=i+1;j<=12;j++){
if(!card[j]){
break;
}
card[j]--;
cnt++;
if(cnt>=5){
cp(step+1,num-cnt);
}
}
for(int j=i;j<=i+cnt-1;j++)card[j]++;
}
}
//双顺子
for(int i=1;i<=10;i++){
if(card[i]>=2){
int a=i,zs=1;
card[i]--;
int cnt=1;
for(int j=i+1;j<=12;j++){
if(card[j]<2){
break;
}
card[j]-=2;
cnt++;
if(cnt>=3){
cp(step+1,num-2*cnt);
}
}
for(int j=i;j<=i+cnt-1;j++)card[j]++;
}
}
//三顺子
for(int i=1;i<=11;i++){
if(card[i]>=3){
int a=i,zs=1;
card[i]--;
int cnt=1;
for(int j=i+1;j<=12;j++){
if(card[j]<3){
break;
}
card[j]-=3;
cnt++;
if(cnt>=2){
cp(step+1,num-3*cnt);
}
}
for(int j=i;j<=i+cnt-1;j++)card[j]++;
}
}
//三带二
for(int i=1;i<=13;i++){
if(card[i]>=3){
card[i]-=3;
for(int j=0;j<=13;j++){
if(card[j]>=2){
card[j]-=2;
cp(step+1,num-5);
card[j]+=2;
}
}
card[i]+=3;
}
}
//三带一
for(int i=1;i<=13;i++){
if(card[i]>=3){
card[i]-=3;
for(int j=0;j<=13;j++){
if(card[j]){
card[j]--;
cp(step+1,num-4);
card[j]++;
}
}
card[i]+=3;
}
}
//单出1,2,3,4
int cc=0,cnt=0;
for(int i=0;i<=13;i++){
if(card[i]){
cc++;
}
}
cp(step+cc,0);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T,n;
cin>>T>>n;
while(T--){
for(int i=0;i<=20;i++){
card[i]=0;
}
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
if(a>=3)a-=2;
if(a==1)a=12;
if(a==2)a=13;
card[a]++;
}
ans=1e9;
cp(0,n);
cout<<ans<<"\n";
}
return 0;
}