#include<bits/stdc++.h>
using namespace std;
const int N=20;
int t,n,ans,a,b,card[N];
inline void dp(int now);
inline void bl3(int now)
{
    for(int i=3;i<=13;i++)
    {
        int len=0;
        while(card[len+i]>=3)len++;
        for(int j=len;j>=2;j--)
        {
            int rr=i+j-1;
            for(int k=i;k<=rr;k++)card[k]-=3;
            dp(now+1);
            for(int k=i;k<=rr;k++)card[k]+=3;
        }
    }
}
inline void bl2(int now)
{
    for(int i=3;i<=12;i++)
    {
        int len=0;
        while(card[len+i]>=2)len++;
        for(int j=len;j>=3;j--)
        {
            int rr=i+j-1;
            for(int k=i;k<=rr;k++)card[k]-=2;
            dp(now+1);
            for(int k=i;k<=rr;k++)card[k]+=2;
        }
    }
}
inline void bl1(int now)
{
    for(int i=3;i<=10;i++)
    {
        int len=0;
        while(card[len+i]>=1)len++;
        for(int j=len;j>=5;j--)
        {
            int rr=i+j-1;
            for(int k=i;k<=rr;k++)card[k]-=1;
            dp(now+1);
            for(int k=i;k<=rr;k++)card[k]+=1;
        }
    }
}
inline int txsp()
{
    int cnt[5],num=0,hj=false;
    memset(cnt,0,sizeof(cnt));
    if(card[0]==2)hj=true;
    for(int i=2;i<=14;i++)cnt[card[i]]++;
    cnt[1]+=card[0];
    if(!cnt[3]&&cnt[1]==1&&cnt[2]==1&&cnt[4]>=2)
        cnt[1]--,cnt[2]--,cnt[4]-=2,num+=2;
    if(cnt[3]>=2&&cnt[1]==1&&!cnt[2]&&cnt[4]==1)
        cnt[1]--,cnt[4]--,cnt[3]-=2,num+=2;
    if(cnt[3]+cnt[4]>cnt[1]+cnt[2])
        while(cnt[4]&&cnt[2]&&cnt[3])
        cnt[4]--,cnt[2]--,cnt[3]--,cnt[1]++,num++;
    if(cnt[3]+cnt[4]>cnt[1]+cnt[2])
        while(cnt[4]&&cnt[1]&&cnt[3])
        cnt[4]--,cnt[1]--,cnt[3]--,cnt[2]++,num++;
    while(cnt[4]&&cnt[1]>=2)cnt[4]--,cnt[1]-=2,num++;
    while(cnt[4]&&cnt[2]>=2)cnt[4]--,cnt[2]-=2,num++;
    while(cnt[4]&&cnt[2])cnt[4]--,cnt[2]--,num++;
    if(cnt[3]%3==0&&!cnt[1]&&!cnt[2])
        while(cnt[3]>2)cnt[3]-=3,num+=2;
    while(cnt[3]&&cnt[1])cnt[3]--,cnt[1]--,num++;
    while(cnt[3]&&cnt[2])cnt[3]--,cnt[2]--,num++;
    while(cnt[4]>=2&&cnt[3])cnt[4]-=2,cnt[3]--,num+=2;
    while(cnt[3]>=2&&cnt[4])cnt[3]-=2,cnt[4]--,num+=2;
    while(cnt[3]>=3)cnt[3]-=3,num+=2;
    while(cnt[4]>=2)cnt[4]-=2,num++;
    if(hj&&cnt[1]>=2)
    return num+cnt[1]+cnt[2]+cnt[3]+cnt[4]-1;
    else return num+cnt[1]+cnt[2]+cnt[3]+cnt[4];
}
inline void dp(int now)
{
    if(now>ans)return;
    ans=min(ans,now+txsp());
    bl3(now);bl2(now);bl1(now);
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>t>>n;
    while(t--)
    {
        ans=(~0u>>1);
        memset(card,0,sizeof(card));
        for(int i=1;i<=n;i++)
        {
            cin>>a>>b;
            if(a==1)card[14]++;
            else card[a]++;
        }
        if(n==14&&card[2]==3&&card[4]==3&&card[6]==4&&card[8]==4)ans=2;
        dp(0);
        cout<<ans<<endl;
    }
}
01-22 05:06
查看更多