3 条题解

  • 2
    @ 2025-03-20 20:07:30

    我作著来了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 0

    #include<iostream>
    using namespace std;
    inline int read()
    {
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
    }
    int T,n;
    int cnt[17],ans=99;
    const int size[4]={0,5,3,2};
    void dfs(int x)
    {
    if(x>ans) return;
    for(int i=3;i;i--)//处理顺子,i是顺子中相同牌的个数
    {
    int l=0;
    for(int j=3;j<=14;j++)
    {
    if(cnt[j]>=i) l++;else l=0;
    if(l>=size[i])
    {
    for(int k=j-l+1;k<=j;k++) cnt[k]-=i;
    dfs(x+1);
    for(int k=j-l+1;k<=j;k++) cnt[k]+=i;
    }
    }
    }
    for(int i=2;i<=14;i++)//处理4带2,注意处理4带两对
    {
    if(cnt[i]>=4)
    {
    cnt[i]-=4;
    for(int j=2;j<=14;j++)
    {
    if(i==j||cnt[j]<2) continue;
    cnt[j]-=2;
    for(int k=2;k<=14;k++)
    {
    if(cnt[k]<2||k==j) continue;
    cnt[k]-=2;dfs(x+1);cnt[k]+=2;
    }
    cnt[j]+=2;
    }
    for(int j=2;j<=15;j++)
    {
    if(i==j||cnt[j]<1) continue;
    --cnt[j];
    for(int k=2;k<=15;k++)
    {
    if(cnt[k]<1||k==j) continue;
    --cnt[k];dfs(x+1);++cnt[k];
    }
    ++cnt[j];
    }
    cnt[i]+=4;
    }
    }
    for(int i=2;i<=14;i++)//处理3带(1\2)
    {
    if(cnt[i]>=3)//3带2
    {
    cnt[i]-=3;
    for(int j=2;j<=14;j++)
    {
    if(cnt[j]<2||i==j) continue;
    cnt[j]-=2;
    dfs(x+1);
    cnt[j]+=2;
    }
    for(int j=2;j<=15;j++)//3带1
    {
    if(cnt[j]<1||i==j) continue;
    --cnt[j];dfs(x+1);++cnt[j];
    }
    cnt[i]+=3;
    }
    }
    for(int i=2;i<=15;i++) if(cnt[i]>0) ++x;//剩下的牌只能每种相同的牌单独出,每种牌只用出一次
    ans=min(ans,x);
    }
    int main()
    {
    T=read(),n=read();
    while(T--)
    {
    memset(cnt,0,sizeof(cnt));
    ans=99;
    for(int i=1;i<=n;i++){int x=read();if(x!=0)cnt[x]++;else cnt[15]++;x=read();}
    cnt[14]=cnt[1];dfs(0);printf("%d\n",ans);

    }
    return 0;
    }
    专坑袁浩轩

  • 0

    #include<iostream>
    using namespace std;
    inline int read()
    {
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
    }
    int T,n;
    int cnt[17],ans=99;
    const int size[4]={0,5,3,2};
    void dfs(int x)
    {
    if(x>ans) return;
    for(int i=3;i;i--)//处理顺子,i是顺子中相同牌的个数
    {
    int l=0;
    for(int j=3;j<=14;j++)
    {
    if(cnt[j]>=i) l++;else l=0;
    if(l>=size[i])
    {
    for(int k=j-l+1;k<=j;k++) cnt[k]-=i;
    dfs(x+1);
    for(int k=j-l+1;k<=j;k++) cnt[k]+=i;
    }
    }
    }
    for(int i=2;i<=14;i++)//处理4带2,注意处理4带两对
    {
    if(cnt[i]>=4)
    {
    cnt[i]-=4;
    for(int j=2;j<=14;j++)
    {
    if(i==j||cnt[j]<2) continue;
    cnt[j]-=2;
    for(int k=2;k<=14;k++)
    {
    if(cnt[k]<2||k==j) continue;
    cnt[k]-=2;dfs(x+1);cnt[k]+=2;
    }
    cnt[j]+=2;
    }
    for(int j=2;j<=15;j++)
    {
    if(i==j||cnt[j]<1) continue;
    --cnt[j];
    for(int k=2;k<=15;k++)
    {
    if(cnt[k]<1||k==j) continue;
    --cnt[k];dfs(x+1);++cnt[k];
    }
    ++cnt[j];
    }
    cnt[i]+=4;
    }
    }
    for(int i=2;i<=14;i++)//处理3带(1\2)
    {
    if(cnt[i]>=3)//3带2
    {
    cnt[i]-=3;
    for(int j=2;j<=14;j++)
    {
    if(cnt[j]<2||i==j) continue;
    cnt[j]-=2;
    dfs(x+1);
    cnt[j]+=2;
    }
    for(int j=2;j<=15;j++)//3带1
    {
    if(cnt[j]<1||i==j) continue;
    --cnt[j];dfs(x+1);++cnt[j];
    }
    cnt[i]+=3;
    }
    }
    for(int i=2;i<=15;i++) if(cnt[i]>0) ++x;//剩下的牌只能每种相同的牌单独出,每种牌只用出一次
    ans=min(ans,x);
    }
    int main()
    {
    T=read(),n=read();
    while(T--)
    {
    memset(cnt,0,sizeof(cnt));
    ans=99;
    for(int i=1;i<=n;i++){int x=read();if(x!=0)cnt[x]++;else cnt[15]++;x=read();}
    cnt[14]=cnt[1];dfs(0);printf("%d\n",ans);

    }
    return 0;
    }

  • 1

信息

ID
1411
难度
9
分类
(无)
标签
递交数
3
已通过
2
通过率
67%
上传者