题面戳我

题解

我原来也觉得是一道不可做的难题。。

其实,,,很简单的啦。。。

对于当前状态

我们出牌的方式大致分为两类

一类是不用考虑点数的,包括单张,对子,三带一等

另一类就是需要考虑点数的,包括顺子等

因此,每种状态下,首先考虑不用考虑点数的出牌方法

尝试打完,更新打完。

搜索的作用是考虑要考虑点数的出牌方法

每次搜索去掉若干张牌,然后递归,继续考虑不考虑点数的出牌方法。

然后就发现这道题目特别简单啦。。。

(还没懂就看代码吧。。。)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int ans,N,a[20];
void DFS(int st)
{
if(st>ans)return;
int b[5];
b[1]=b[2]=b[3]=b[4]=0;
for(int i=1;i<=14;++i)b[a[i]]++;
//方式1:四张带两张/对
for(int i=1;i<=14;++i)
if(a[i]==4)
{
if(b[1]>1){b[1]-=2;continue;}//带走两张单牌
else if(b[2]>1){b[2]-=2;continue;}//带走两对牌
else if(b[2]){b[2]--;continue;}//只能带走一对
}
//方式2:三张带一张/对
for(int i=1;i<=14;++i)
{
if(a[i]==3)
{
if(b[1])b[1]--;//带一张
else if(b[2])b[2]--;//带一对
}
}
ans=min(st+b[1]+b[2]+b[3]+b[4],ans);//上面的出牌方式和ans比较
//接下来的方式需要考虑牌的点数
int pos;
for(int i=1;i<=8;++i)//顺子的开始位置
{
pos=12;
for(int j=i;j<13;++j)//最多打到A
{
a[j]--;//打出顺子
if(a[j]==-1){pos=j;break;}//没有这么多牌呀。。。
if(j-i>3)DFS(st+1);//打出了一个顺子
}
while(pos>=i)a[pos--]++;//回溯
}
for(int i=1;i<=10;++i)
{
pos=12;
for(int j=i;j<13;++j)
{
a[j]-=2;
if(a[j]<0){pos=j;break;}
if(j-i>1)DFS(st+1);//一个双顺子
}
while(pos>=i)a[pos--]+=2;
}
for(int i=1;i<=11;++i)
{
pos=12;
for(int j=i;j<13;++j)
{
a[j]-=3;
if(a[j]<0){pos=j;break;}
if(j-i)DFS(st+1);
}
while(pos>=i)a[pos--]+=3;
}
}
int main()
{
int T=read();N=read();
while(T--)
{
memset(a,0,sizeof(a));
for(int i=1;i<=N;++i)
{
int x=read(),y=read();
if(x==0)a[14]++;
else if(x<3)a[x+11]++;
else a[x-2]++;
}
ans=N;
DFS(0);
printf("%d\n",ans);
}
return 0;
}

【NOIP2015】斗地主(搜索,贪心)的更多相关文章

  1. 【BZOJ4325】NOIP2015 斗地主 搜索+贪心

    这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...

  2. NOIP2015斗地主[DFS 贪心]

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

  3. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝

    [BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...

  4. 2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)

    传送门 原来一直以为是一道大模拟. 没想到是一道搜索+最优性剪枝 如何搜最优呢? 我们考虑怎么最快出完. 大概是应该尽量出当前能出出去最多的吧. 于是我们选择优先出顺子. 这样做有什么好处呢? 我们会 ...

  5. 洛谷 2668&2540 斗地主——搜索+贪心+dp

    题目:https://www.luogu.org/problemnew/show/P2540 发现如果没有顺子,剩下的可以贪心.所以搜索顺子怎么出,然后贪心. 这样只能过不加强版.原因是贪心的时候难以 ...

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

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

  7. LOJ2422 NOIP2015 斗地主 【搜索+贪心】*

    LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...

  8. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  9. 2106. [NOIP2015] 斗地主

        2106. [NOIP2015] 斗地主 ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比 时间限制:2 s   内存限制:1025 M ...

  10. BZOJ 4325: NOIP2015 斗地主

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 684  Solved: 456[Submit][Status] ...

随机推荐

  1. 解决angularjs 在ie8上面 ng-repeat的select控件兼容性问题

    问题描述: 在ie8下生成select的option时候使用ng-repeat,会造成下拉列表的列表显示值为{{x.displayname}}的形式,但是选中之后,选中值却又是正确的,此问题不在chr ...

  2. redis新手入门,摸不着头脑可以看看<二>

    对<Redis开发与运维>的理解--下文中引号部分来自该书,略有修改 P19.  Redis有序集合(图2-1) "Redis有序集合和集合一样也是某种类型元素的集合,不重复.不 ...

  3. js到底new了点啥

    在最开始学习js的时候,我看书上写着,创建一个数组,一个对象通常使用new,如下: var arr=new Array(),//arr=[] obj=new Object();//obj={} 到了后 ...

  4. CEF小白人系列1-认识CEF

    手头上有个项目需要做浏览器的相关功能,评估了几个嵌入式方案最后选定CEF作为开发基础. 在入坑新技术的时候第一选择是去官网学习,这是一个非常好的习惯. CEF官网(请科学上网) https://bit ...

  5. mysql 学习心得3

    1 /0和 %0 都会显示null 2比较运算符大部分和c一样 ==在mysql是=  <>代表不等于 between 指定范围内 in指定几何 isnull 判断是否为null :is ...

  6. NJU 1010 Air

    思路:把那张图打表(吐血...),然后就按照规则输出就行. AC代码 #include <cstdio> #include <cmath> #include <cctyp ...

  7. nyoj1246 逃离妖洞 BFS

        逃离妖洞 描述 唐僧不小心又掉入妖怪的迷宫了.这个迷宫有n行m列,共n*m个方格.有的方格是空的,唐僧可以站在上面,有些是有障碍物的不能站.每次唐僧可以移动到相邻的8个空方格上.但是有些情况不 ...

  8. (转载)SVM-基础(三)

    支持向量机: Kernel  by pluskid, on 2010-09-11, in Machine Learning     70 comments 本文是"支持向量机系列" ...

  9. NewLife.XCode 上手指南2018版(一)代码生成

    目录 NewLife.XCode 上手指南2018版(一)代码生成 NewLife.XCode 上手指南2018版(二)增 NewLife.XCode 上手指南2018版(三)查 NewLife.XC ...

  10. Linux常用软件

    网络应用 即时聊天 pidgin 支持多协议,如msn, yahoo, icq, irc ... eva QQ 聊天客户端,KDE程序,推荐 Skype 网络电话,网络聊天,推荐 lumaqq Jav ...