1 条题解

  • 0
    @ 2021-10-7 14:46:04
    #include<cstdio>
    #include<cstring>
    int i,j,k,t,n,ans;
    int a[20],b;
    int x,y,z,w;
    bool tre,twi,onc;
    void calc(int value, int x, int y, int z, int w)
    {
        if (value>ans) return;
        if (z==0 && w==0)
        {
            if (value+x+y<ans) ans=value+x+y;
            return;
        } 
        if (w>0)
        {
            if (x>=2) calc(value+1,x-2,y,z,w-1);
            if (y>=2) calc(value+1,x,y-2,z,w-1);
            if (y>=1) calc(value+1,x,y-1,z,w-1);
            calc(value+1,x,y,z,w-1);
        }
        else if (z>0)
        {
            if (x>0) calc(value+1,x-1,y,z-1,w);
            else if (y>0) calc(value+1,x,y-1,z-1,w);
            else 
            {
                if (value+z<ans) ans=value+z;
                return;
            }
        }
    }
    void dfs(int step)
    {
        if (step>ans) return;
        if (tre==1)
        {
          for (int i=3; i<=13; i++)
              if (a[i]>=3)
              {
                  int j;
                  for (j=i+1; j<=14; j++)
                    if (a[j]<3) break;
                  if (j-i>=2)
                  {
                      for (int k=i; k+1<j; k++)
                        for (int l=k+1; l<j; l++)
                        {
                            for (int h=k; h<=l; h++)
                              a[h]-=3;
                            dfs(step+1);
                            for (int h=k; h<=l; h++)
                              a[h]+=3;
                        }
                  }
                  i=j;
              }
        }
        if (twi==1)
        {
        for (int i=3; i<=12; i++)
          if (a[i]>=2)
          {
              int j;
              for (j=i+1; j<=14; j++)
                if (a[j]<2) break;
              if (j-i>=3)
              {
                  for (int k=i; k+2<j; k++)
                    for (int l=k+2; l<j; l++)
                    {
                        for (int h=k; h<=l; h++)
                          a[h]-=2;
                        dfs(step+1);
                      for (int h=k; h<=l; h++)
                          a[h]+=2;
                    }
              }
              i=j;
          }
        }
        if (onc==1)
        {
        for (int i=3; i<=10; i++)
          if (a[i]>=1)
          {
              int j;
              for (j=i+1; j<=14; j++)
                if (a[j]<1) break;
              if (j-i>=5)
              {
                  for (int k=i; k+4<j; k++)
                    for (int l=k+4; l<j; l++)
                    {
                        for (int h=k; h<=l; h++)
                          a[h]-=1;
                        dfs(step+1);
                      for (int h=k; h<=l; h++)
                          a[h]+=1;
                    }
              }
              i=j;
          }
        }
        if (step>ans) 
          return;
        x=y=z=w=0;
        for (int i=0; i<=14; i++)
        if (a[i]>0)
        {
            if (a[i]==1) x++;
            else if (a[i]==2) y++;
            else if (a[i]==3) z++;
            else w++;
        }
        calc(step,x,y,z,w);
    }
    int main()
    {
        scanf("%d%d",&t,&n);
        for (i=1; i<=t; i++)
        {
            memset(a,0,sizeof(a));
            ans=20; tre=twi=onc=0; //tre,twi,onc统计是否有3,2,1张的连牌存在 
            for (j=1; j<=n; j++)
            {
              scanf("%d%*d",&b);
              if (b==1) 
                  b=14;
              a[b]++;
            }
            for (j=3; j<=13; j++)
                if (a[j]>=3){
                  for (k=j+1; k<=14; k++)
                    if (a[k]<3) break;
                  if (k-j>=2) tre=1;
                }
            for (j=3; j<=12; j++)
              if (a[j]>=2)
              {
                  for (k=j+1; k<=14; k++)
                    if (a[k]<2) break;
                  if (k-j>=3) twi=1;
              }
            for (j=3; j<=10; j++)
              if (a[j]>=1)
              {
                  for (k=j+1; k<=14; k++)
                    if (a[k]<1) break;
                  if (k-j>=5) onc=1;
              }
            dfs(0);
            printf("%d\n",ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    754
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    24
    已通过
    12
    上传者