传送门

原来一直以为是一道大模拟。

没想到是一道搜索+最优性剪枝

如何搜最优呢?

我们考虑怎么最快出完。

大概是应该尽量出当前能出出去最多的吧。

于是我们选择优先出顺子。

这样做有什么好处呢?

我们会发现除了顺子以外的牌都能够直接算最少需要出几轮。

因此把顺子出完之后更新答案就行了。

于是出牌优先级:顺子>四带二>四带一>三带二>三带一>对子>单牌

代码:

#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 斗地主(贪心+搜索)的更多相关文章

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

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

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

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

  3. NOIP2015斗地主(搜索+模拟+贪心)

    %%%Luan 题面就不说了,和斗地主一样,给一组牌,求最少打几次. 注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的. 枚举方法,每次搜索按照(三顺子>二顺子>普 ...

  4. 2018.11.01 NOIP训练 木棒分组(搜索+剪枝)

    传送门 测试搜索的时候状态定义错了233. 我们把木棒从大到小排序. 然后保证每一组搜到的木棒出现的长度是从大到小递减的. 直接定义现在搜的木棒从什么位置开始,当前这一组的总长度,之前几组的总长度. ...

  5. 2018.11.01 NOIP训练 某种密码(折半搜索)

    传送门 直接折半搜索,把所有和装到unorderedmapunordered_mapunorderedm​ap里面最后统计答案就行了. 然后考试的时候读优并没有处理有负数的情况于是爆零了 代码

  6. 2018.11.01 NOIP训练 cost数(搜索+容斥原理)

    传送门 唉考试的时候忘记剪倍数的枝了666666分滚粗. 其实就是一直取lcmlcmlcm搜索,然后容斥原理统计就行了. 代码

  7. [NOIP2015] 斗地主(搜索)

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

  8. bzoj4325: NOIP2015 斗地主(爆搜+模拟)

    去年的我还不会打斗地主呵呵 觉得这道题挺难的..抄了一遍题解,感触挺多的= = 首先出牌的方式太多了不能每次都枚举所有的出牌方式, 于是分成两部分:1.顺子 2.带牌等其他 每次dfs都搜顺子,而且顺 ...

  9. 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]表示在被选择的集合当中. 大力记忆化搜索就行了. ...

随机推荐

  1. java里面获取map的key和value的方法

    获取map的key和value的方法分为两种形式: map.keySet():先获取map的key,然后根据key获取对应的value: map..entrySet():同时查询map的key和val ...

  2. TOJ4413: IP address

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4413 时间限制(普通/Java): ...

  3. Fiddler调试和Wireshark数据包分析

    扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  4. js中json知识点

    首先,json是一种数据格式,而不能说是一种对象(object).这一点是非常重要的. 起源是不同的语言中数据对象的形式是不一样的,我们为了在不同的语言中传递数据,发明了一种json格式用于消除这种差 ...

  5. 配置eclipse+SDK+ADT开发环境

    第一步:配置jdk和eclipse环境(已完成): 第二步:ADT配置:依次点击菜单栏:help -> Install new software -> Add -> Local... ...

  6. java ATM模拟程序

    //基本功能已经完善,文件读取没有问题,文件重写尚未完成. Account类 public class Account { //初始化参数 private String accountID; priv ...

  7. 【RabbitMQ】——5种队列(转)

    原文地址:https://blog.csdn.net/u012654963/article/details/76417613 应用RabbitMQ,我们可以根据需求选择5种队列之一. 一.简单队列 P ...

  8. Composer 安装以及使用方法

    Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. Linux 下安装 curl -sS https://getcomposer.org/ ...

  9. Aspose.Words五 MergeField

    通过MegerField来循环,将数据保存到dataset的table中,dataset通过关联datarelation字段来指定主从表关系.模板中通过标签TableStart和TableEnd来框定 ...

  10. echarts柱形图x轴显示不全或者每隔一个不显示的问题

    问题原因可能:x轴数据间隔太小: 问题解决: 1.调整间隔属性 xAxis: { type: 'category', //坐标轴斜着显示 axisLabel: { interval:0, rotate ...