毒瘤题目,搞了三天……


也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟……

主要还是靠码力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t,n;
int card[25],sp[25],ans=0x7fffff;
int x;
inline int read()
{
    int k=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar())
      if(c=='-')
        f=-1;
    for(;isdigit(c);c=getchar())
      k=(k<<3)+(k<<1)+c-48;
    return k*f;
}
void dfs(int sum,int step)
{
    if(sum<0||step>=ans)
      return;
    if(sum==0)
    {
      ans=min(ans,step);
      return ;
    }

    //============顺子
    int flag[101]={0},tot=0,pc[101]={0};

    flag[3]=flag[2]=flag[1]=0;  tot=0;
    for(int i=3;i<=14;i++)
    {
        if(card[i]>=3)
        {
            flag[3]++;
            pc[++tot]=i;
        }
        else
        {
            flag[3]=0;
            tot=0;
            continue;
        }

        if(flag[3]>=2)
        {
            for(int j=1;j<=tot;j++)
            {
                card[pc[j]]-=3;
            }
            dfs(sum-3*tot,step+1);
            for(int j=1;j<=tot;j++)
            {
                card[pc[j]]+=3;
            }
        }
    }

    tot=0;
    for(int i=3;i<=14;i++)
    {
        if(card[i]>=2)
        {
            flag[2]++;
            pc[++tot]=i;
        }
        else
        {
            flag[2]=0;
            tot=0;
            continue;
        }
        if(flag[2]>=3)
        {
            for(int j=1;j<=tot;j++)
            {
                card[pc[j]]-=2;
            }
            dfs(sum-2*tot,step+1);
            for(int j=1;j<=tot;j++)
            {
                card[pc[j]]+=2;
            }
        }
    }

    tot=0;
    for(int i=3;i<=14;i++)
    {
        if(card[i]>=1)
        {
            flag[1]++;
            pc[++tot]=i;
        }
        else
        {
            flag[1]=0;
            tot=0;
            continue;
        }
        if(flag[1]>=5)
        {
            for(int j=1;j<=tot;j++)
            {
                card[pc[j]]-=1;
            }
            dfs(sum-tot,step+1);
            for(int j=1;j<=tot;j++)
            {
                card[pc[j]]+=1;
            }
        }
    }
    //========四带
    flag[11]=flag[12]=0;
    for(int i=3;i<=15;i++)
    {
        if(card[i]>=4)
        {
            card[i]-=4;
            for(int j=0;j<=15;j++)
            {
                if(card[j]>=4)
                {
                    card[j]-=4;
                    dfs(sum-8,step+1);
                    card[j]+=4;
                }
                if(card[j]>=2)
                {
                    card[j]-=2;
                    for(int k=3;k<=15;k++)
                    {
                        if(card[k]>=2)
                        {
                            card[k]-=2;
                            dfs(sum-8,step+1);
                            card[k]+=2;
                        }
                    }
                    dfs(sum-6,step+1);
                    card[j]+=2;
                }
                if(card[j]>0)
                {
                    for(int k=0;k<15;k++)
                    {
                        if(card[k]>0)
                        {
                            if(j==k)
                              continue;
                            card[j]-=1;  card[k]-=1;
                            dfs(sum-6,step+1);
                            card[j]+=1; card[k]+=1;
                        }
                    }
                }
            }
            dfs(sum-4,step+1);
            card[i]+=4;
        }
    }
    //======三带
    flag[11]=flag[12]=0;
    for(int i=1;i<=15;i++)
    {
        if(card[i]>=3)
        {
            card[i]-=3;
            for(int j=0;j<=15;j++)
            {
                if(i==j)
                  continue;
                if(card[j]>=1)
                {
                    card[j]-=1;
                    dfs(sum-4,step+1);
                    card[j]+=1;
                }
                if(card[j]>=2&&j!=0)
                {
                    card[j]-=2;
                    dfs(sum-5,step+1);
                    card[j]+=2;
                }
            }
            dfs(sum-3,step+1);
            card[i]+=3;
        }
    }
    //单张+对子
    flag[32]=0,flag[5]=0;
    for(int i=0;i<=15;i++)
    {
        if(card[i]==2)
        {
            flag[5]++;
        }
        if(card[i]==1)
        {
            flag[32]++;
        }
    }
    if(sum-2*flag[5]-flag[32]==0)
      ans=min(ans,step+flag[5]+flag[32]);
}
int main()
{
    t=read(),n=read();
    while(t--)
    {
        ans=0x7fffff;
        memset(card,0,sizeof(card));
        for(int i=1;i<=n;i++)
        {
            int col,x;
            x=read(),col=read();
            if(x==1||x==2)
              card[13+x]++;
            else
              card[x]++;
        }
        dfs(n,0);
        printf("%d\n",ans);
    }
    return 0;
}

洛谷 P2668 斗地主的更多相关文章

  1. 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]

    P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...

  2. [NOIP2015] 提高组 洛谷P2668 斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  3. 洛谷P2668 斗地主 [NOIP2015]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  4. 洛谷P2668斗地主(搜索)noip2015

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  5. 洛谷—— P2668 斗地主

    https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...

  6. 洛谷P2668 斗地主

    好,终于搞完了这一道毒瘤题...... 先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索. 先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌. 大体思路很简单, ...

  7. 题解【洛谷P2668】[NOIP2015]斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...

  8. 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心

    题目:https://www.luogu.org/problemnew/show/P2668   https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...

  9. 【noip】跟着洛谷刷noip题

    传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...

随机推荐

  1. PHP实现用户登录注册功能

    初学php做了一些比较常见且有用的页面,放在上面记录一下咯 我是用了bootstrap框架里面的模态框做注册登陆页面,这样页面比较美观 页面效果: 注册成功条件/功能: 1)用户名不能冲突 2)两次密 ...

  2. springcloud2 (三) 服务治理Eureka及其实现原理

    代码地址:https://gitlab.com/showkawa/architect/tree/master/microservice/eurake 基于springcloud2分析eurake知识点 ...

  3. Win7下Intellij开发Scala环境搭建

    1.Scala下载并安装 1.Scala的安装时需要依赖JDK的,目前我的电脑上,jdk是已经安装好了,这里就不再说明 2.在地址http://www.scala-lang.org/download/ ...

  4. aws cli command line interface的安装与使用

    安装 在centos中安装aws cli,安装依赖python,先装好python,然后按下述命令执行 yum install wget wget https://bootstrap.pypa.io/ ...

  5. Zynq7000开发系列-5(OpenCV开发环境搭建:Ubuntu、Zynq)

    操作系统:Ubuntu14.04.5 LTS 64bit OpenCV:OpenCV 3.1.0.opencv_contrib gcc:gcc version 4.8.4 (Ubuntu 4.8.4- ...

  6. E - Addition and Subtraction Hard AtCoder - 2273 思维观察题

    http://arc066.contest.atcoder.jp/tasks/arc066_c?lang=en 这类题目是我最怕的,没有什么算法,但是却很难想, 这题的题解是这样的,观察到,在+号里面 ...

  7. 如何连接MDB数据,并且获取相关的数据

    不说了直接上代码: try{ String str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + address + & ...

  8. SQL server函数

    一般在开发中用到的函数 标量函数用的比较多 标量函数:就是返回一个单一的结果值 下面介绍一下标量函数的语法 create function GetFunction  --创建函数 (   @name ...

  9. Spring框架学习——AOP的开发

    一.AOP开发中的相关术语. ——JoinPoint(连接点):指那些可以被拦截到的点.比如增删改查方法都可以增强,这些方法就可以被称为是连接点. ——PointCut:切入点,真正被拦截的点,指对哪 ...

  10. Java-String字符串相关

    字符串String: 封装char[] 字符数组,不可变(因为在底层代码中,值用final关键字修饰) 字符串的字面值: 如果第一次用到一个字符串字面值,会在内存中"字符串常量池" ...