【NOIP2015】斗地主(搜索,贪心)
题解
我原来也觉得是一道不可做的难题。。
其实,,,很简单的啦。。。
对于当前状态
我们出牌的方式大致分为两类
一类是不用考虑点数的,包括单张,对子,三带一等
另一类就是需要考虑点数的,包括顺子等
因此,每种状态下,首先考虑不用考虑点数的出牌方法
尝试打完,更新打完。
搜索的作用是考虑要考虑点数的出牌方法
每次搜索去掉若干张牌,然后递归,继续考虑不考虑点数的出牌方法。
然后就发现这道题目特别简单啦。。。
(还没懂就看代码吧。。。)
#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】斗地主(搜索,贪心)的更多相关文章
- 【BZOJ4325】NOIP2015 斗地主 搜索+贪心
这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- 2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)
传送门 原来一直以为是一道大模拟. 没想到是一道搜索+最优性剪枝 如何搜最优呢? 我们考虑怎么最快出完. 大概是应该尽量出当前能出出去最多的吧. 于是我们选择优先出顺子. 这样做有什么好处呢? 我们会 ...
- 洛谷 2668&2540 斗地主——搜索+贪心+dp
题目:https://www.luogu.org/problemnew/show/P2540 发现如果没有顺子,剩下的可以贪心.所以搜索顺子怎么出,然后贪心. 这样只能过不加强版.原因是贪心的时候难以 ...
- 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668 https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 M ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
随机推荐
- iOS UITableView的多选
一些列表经常需要编辑多选的功能,而UITableview自带多选删除的功能,使用起来方便,不需要自己去做数据存储和选中状态转换,可以减少不少开发时间.下面就来介绍下UITableView多选的使用. ...
- 讲解mybaits的标签语法
前言:mybatis作为一个持久层的java框架,高度封装了jdbc原始代码,它拥有比Hiberante更便捷.更直接的sql语法和sql灵活配置的特性,比如简单的一个自动映射对象就大大减少了我们的代 ...
- PHP生成图片验证码、点击切换实例
http://www.jb51.net/article/51506.htm 现在让我们来看下 PHP 代码 复制代码代码如下: <?php session_start();function ra ...
- LINUX服务器下用root登录ftp
因为安全方面的原因,root用户是默认不能登录ftp服务的. 如果一定要用root登录,则: 1.删除或注释/etc/vsftpd.ftpusers中的root 2.删除或注释/etc/vsftpd. ...
- golang 实现简单的一致性哈希
package main import ( "fmt" "sort" "hash/crc32" ) var serverMap map[ui ...
- 搭建ssr服务器
搭建ssr服务器 首先,先说一下,为什么这么久没写博客. 一方面,最近在搭建自己的服务器.挺忙的. 另一方面,写了许多有关服务器构建,网站构建的word.但没有润色,所以打算等自己服务器做好了整理一下 ...
- 深入java虚拟机学习 -- 类的加载机制(续)
昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
- 关于UIButton嵌入到UIView点击无反应问题的解决方法和delegate的简单用法示例(转载)
做项目封装UIView的时候碰到的问题,没想到有个哥们儿还写成博客,特此收藏! 问题是这样的,几个界面用到同一个自定义返回按钮,于是就想着把这个按钮单独封装起来,添加一个UIView类,在里面自定义U ...
- 运行web项目端口占用问题
---恢复内容开始--- 有时候运行web项目会提示8080端口已经被占用这一类问题(Error running Tomcat8: Address localhost:1099 is already ...
- flask项目开发中,遇到http 413错误
在flask项目中,上传文件时后台报http 413 Request Entity Too Large 请求体太大错误! 解决的2种方法: 1.在flask配置中设置 MAX_CONTENT_LENG ...