2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)
传送门
原来一直以为是一道大模拟。
没想到是一道搜索+最优性剪枝
如何搜最优呢?
我们考虑怎么最快出完。
大概是应该尽量出当前能出出去最多的吧。
于是我们选择优先出顺子。
这样做有什么好处呢?
我们会发现除了顺子以外的牌都能够直接算最少需要出几轮。
因此把顺子出完之后更新答案就行了。
于是出牌优先级:顺子>四带二>四带一>三带二>三带一>对子>单牌
代码:
#include<bits/stdc++.h>
using namespace std;
int card[4]={0,5,3,2},r,n,a[15],ans,tot[5];
inline int calc(){
int ret=0;
memset(tot,0,sizeof(tot));
for(int i=0;i<=14;++i)if(i^1)++tot[a[i]];
while(tot[4]&&tot[2]>=2)++ret,--tot[4],tot[2]-=2;
while(tot[4]&&tot[1]>=2)++ret,--tot[4],tot[1]-=2;
while(tot[3]&&tot[2])++ret,--tot[3],--tot[2];
while(tot[3]&&tot[1])++ret,--tot[3],--tot[1];
return ret+tot[1]+tot[2]+tot[3]+tot[4];
}
inline void dfs(int dep){
if(dep>=ans)return;
for(int same=3,j,len;same;--same){
for(int i=3;i<=13;++i){
j=i;
while(a[j]>=same&&j<=14)++j;
--j;
if((len=j-i+1)<card[same])continue;
for(int k=i;k<=i+card[same]-2;++k)a[k]-=same;
for(int k=i+card[same]-1;k<=j;++k)a[k]-=same,dfs(dep+1);
for(int k=i;k<=j;++k)a[k]+=same;
}
}
ans=min(ans,dep+calc());
}
int main(){
scanf("%d%d",&r,&n),ans=n;
for(int i=1,x,y;i<=r;++i,memset(a,0,sizeof(a)),ans=n){
for(int j=1;j<=n;++j)scanf("%d%d",&x,&y),x=x==1?14:x,++a[x];
dfs(0),printf("%d\n",ans);
}
return 0;
}
2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)的更多相关文章
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- NOIP2015斗地主(搜索+模拟+贪心)
%%%Luan 题面就不说了,和斗地主一样,给一组牌,求最少打几次. 注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的. 枚举方法,每次搜索按照(三顺子>二顺子>普 ...
- 2018.11.01 NOIP训练 木棒分组(搜索+剪枝)
传送门 测试搜索的时候状态定义错了233. 我们把木棒从大到小排序. 然后保证每一组搜到的木棒出现的长度是从大到小递减的. 直接定义现在搜的木棒从什么位置开始,当前这一组的总长度,之前几组的总长度. ...
- 2018.11.01 NOIP训练 某种密码(折半搜索)
传送门 直接折半搜索,把所有和装到unorderedmapunordered_mapunorderedmap里面最后统计答案就行了. 然后考试的时候读优并没有处理有负数的情况于是爆零了 代码
- 2018.11.01 NOIP训练 cost数(搜索+容斥原理)
传送门 唉考试的时候忘记剪倍数的枝了666666分滚粗. 其实就是一直取lcmlcmlcm搜索,然后容斥原理统计就行了. 代码
- [NOIP2015] 斗地主(搜索)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- bzoj4325: NOIP2015 斗地主(爆搜+模拟)
去年的我还不会打斗地主呵呵 觉得这道题挺难的..抄了一遍题解,感触挺多的= = 首先出牌的方式太多了不能每次都枚举所有的出牌方式, 于是分成两部分:1.顺子 2.带牌等其他 每次dfs都搜顺子,而且顺 ...
- 2018.11.01 洛谷P3953 逛公园(最短路+dp)
传送门 设f[i][j]f[i][j]f[i][j]表示跟最短路差值为iii当前在点jjj的方案数. in[i][j]in[i][j]in[i][j]表示在被选择的集合当中. 大力记忆化搜索就行了. ...
随机推荐
- pa sslvpn使用手册
1.浏览器输入https://x.x.x.x 根据电脑操作系统及位数选择下载 2.安装 直接“下一步”,到 输入IP地址x.x.x.x 点击连接会有证书错误提示 此时点击显示证书→本地计算机→安装到 ...
- Django的model操作中一些常用的小点
一.django的orm的13种基本的查询方法 1.all方法,查询某张表中的所有的数据 user_obj_list = models.Person.objects.all() 返回的结果是query ...
- spring cloud ribbon和feign的区别
spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign. Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器 它可以在客户端配置 ribb ...
- android轮播图的实现原理
1.轮播图的点:RadioGroup,根据网络请求的数据,解析得到的图片的个数,设置RadioGroup的RadioButton的个数. 2.轮播图的核心技术:用Gallery来存放图片,设置适配器. ...
- Android:webView加载h5网页视频,播放不了,以及横屏全屏的问题和实现自定义加载进度条的效果
1.webView加载h5网页视频,播放不了,android3.0之后要在menifest添加硬件加速的属性 android:hardwareAccelerated="true". ...
- SVO+PL-SVO+PL-StVO
PL-SVO是基于点.线特征的半直接法单目视觉里程计,我们先来介绍一下基于点特征的SVO,因为是在这个基础上提出的. [1]References: SVO: Fast Semi-Direct ...
- 转载:MongoDB之旅(超赞,适合初学者)
MongoDB是目前工作中经常使用到的NoSQL数据库. 本博客只记录相关理论知识和技巧,涉及到实践的部分都会单开Blog来记录实践过程. ------------------------------ ...
- Linux ulimit
一.简介 二.语法 三.其他 1)linux下进程的进程最大数.最大线程数.进程打开的文件数和ulimit命令修改硬件资源限制 http://blog.csdn.net/gatieme/art ...
- 织梦文章里面的图片alt和title属性,用文章标题自动替换
把{dede:field.body/}改成{dede:field.body runphp=yes}global $dsql,$id,$aid;$myid = isset($id) ? $id : $a ...
- C# web服务器被webbench攻击及目现采用的防御措施
web服务器连续两次出现CPU达到100%的情况,第一次还想着是升级时,哪个地方写错了,有死循环,最后重启了三次服务器才好. 但事后分析代码,没有死循环的可能,于是在第二次又出现CPU达100%时,仔 ...