【NOIP2015】斗地主 D1 T3 及 增强版 (送命题)
恶心送命模拟题
暴搜顺子,DP预处理剩下的。 由于官方数据太水,很多情况没有讨论的都能过普通版本,想要测试自己代码正确性的同学们可以交交这道题,有很多dalao给出了hack数据 : Luogu P2540 斗地主 增强版 传送门
具体细节见代码注释
AC code:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 25;
int n, cnt[15], p[5], Ans, dp[6][8][12][24];
// 14 A
// 0 king
template<class T>inline bool chkmin(T &x, T y) { return y < x ? x = y, 1 : 0; }
inline int solve(int i, int j, int k, int w, int king)
{
if(king == 0) return dp[i][j][k][w];
if(king == 1) return dp[i][j][k][w+1]; // 单打
return min(dp[i][j][k][w] + 1, dp[i][j][k][w+2]); //王炸 + 单打
}
int need[4] = { 0, 5, 3, 2 };
void dfs(int now)
{
if(now >= Ans) return;
memset(p, 0, sizeof p); //注意清零
for(int i = 2; i <= 14; i++) p[cnt[i]]++; //统计 4 3 2 1 个的
chkmin(Ans, now + solve(p[4], p[3], p[2], p[1], cnt[0]));
for(int len = 1; len <= 3; len++) //枚举顺子每个数字出现次数
for(int i = 3, j; i <= 14; i++) //枚举起点
{
for(j = i; j <= 14 && cnt[j] >= len; j++) //枚举终点
{
cnt[j] -= len;
if(j - i + 1 >= need[len]) dfs(now+1);
}
while(--j >= i) cnt[j] += len;
}
}
void Pre() //DP预处理
{
memset(dp, 0x3f, sizeof dp);
for(int i = 0; i <= n/4; i++)
for(int j = 0; j <= n/3; j++)
for(int k = 0; k <= n/2; k++)
for(int w = 0; w <= n; w++) if(i*4 + j*3 + k*2 + w <= n)
{
dp[i][j][k][w] = i + j + k + w;
if(i)
{
if(w >= 2) chkmin(dp[i][j][k][w], dp[i-1][j][k][w-2] + 1);
if(k >= 2) chkmin(dp[i][j][k][w], dp[i-1][j][k-2][w] + 1);
chkmin(dp[i][j][k][w], dp[i-1][j][k][w] + 1); // 打 炸弹
chkmin(dp[i][j][k][w], dp[i-1][j][k+2][w]); //拆
chkmin(dp[i][j][k][w], dp[i-1][j][k+1][w+2]); //拆
chkmin(dp[i][j][k][w], dp[i-1][j][k+1][w+2]); //拆
chkmin(dp[i][j][k][w], dp[i-1][j][k][w+4]); //拆
chkmin(dp[i][j][k][w], dp[i-1][j+1][k][w+1]); //拆
}
if(j)
{
if(w >= 1) chkmin(dp[i][j][k][w], dp[i][j-1][k][w-1] + 1);
if(k >= 1) chkmin(dp[i][j][k][w], dp[i][j-1][k-1][w] + 1);
chkmin(dp[i][j][k][w], dp[i][j-1][k][w] + 1); //打 3 个
chkmin(dp[i][j][k][w], dp[i][j-1][k][w+3]); //拆
chkmin(dp[i][j][k][w], dp[i][j-1][k+1][w+1]); //拆
}
if(k) chkmin(dp[i][j][k][w], dp[i][j][k-1][w] + 1), chkmin(dp[i][j][k][w], dp[i][j][k-1][w+2]); // 打 2 个 + 拆
if(w) chkmin(dp[i][j][k][w], dp[i][j][k][w-1] + 1); //打 1 个
}
}
int main ()
{
int T, x, y;
scanf("%d%d", &T, &n);
Pre();
while(T--)
{
memset(cnt, 0, sizeof cnt);
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &x, &y);
if(x == 1) x = 14;// 把 A -> 14
cnt[x]++;
}
Ans = n; dfs(0);
printf("%d\n", Ans);
}
}
【NOIP2015】斗地主 D1 T3 及 增强版 (送命题)的更多相关文章
- Luogu 2540 斗地主增强版(搜索,动态规划)
Luogu 2540 斗地主增强版(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游 ...
- P2540 斗地主增强版
P2540斗地主增强版 参考大佬题解 思路:顺子暴力搜,剩下的牌我不会贪心所以用记忆化搜索(或者dp): 注意:双王不能当对,二不算顺子 代码 #include <cstdio> #inc ...
- 洛谷 题解 P2540 【斗地主增强版】
[分析] 暴力搜顺子,贪心出散牌 为什么顺子要暴力? 玩过斗地主的都知道,并不是出越长的顺子越好,如果你有一组手牌,3,4,5,6,7,6,7,8,9,10,你一下把最长的出了去,你会单两张牌,不如出 ...
- [Luogu2540][NOIP2016]斗地主增强版(搜索+DP)
增强版就是原版中两鬼不算对子的版本. 先爆搜出完所有对子,剩下的牌DP处理. 考虑每个数码的拆牌情况,最多可能被拆成5种情况:1+1+1+1,1+1+2,1+3,2+2,4.故DP状态数最多为5^13 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- [补档][NOIP2015] 斗地主
[NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...
- HLJU 1046: 钓鱼(数据增强版) (贪心+优化)
1046: 钓鱼(数据增强版) Time Limit: 1 Sec Memory Limit: 128 MB Submit: 11 Solved: 3 [id=1046">Subm ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- 最新GHOST XP系统下载旗舰增强版 V2016年
系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...
随机推荐
- GoLang 的变量
变量 1.为什么要变量 1.1.一个程序就是一个世界 1.2.变量是程序的基本组成单位 2.变量的介绍 2.1.变量的概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号, ...
- 使用matplotlib绘制3D函数图像
学习并尝试了利用matplotlib进行3D函数图像的绘制 import matplotlib.pyplot as plt # 绘图用的模块 from mpl_toolkits.mplot3d imp ...
- python_封装redis_hash方法
xshell 进入 虚拟环境 安装 redis workon py3env # 进入虚拟环境 pip install redis # 安装redis deactivate # 退出虚拟环境 简单的封装 ...
- HDU校赛 | 2019 Multi-University Training Contest 1
2019 Multi-University Training Contest 1 http://acm.hdu.edu.cn/contests/contest_show.php?cid=848 100 ...
- 《JAVA高并发编程详解》-volatile和synchronized
- JS把格林威治时间转换为北京标准时间
function fermitTime(time){ var now = new Date(time); var year = now.getFullYear(); ; var date= now.g ...
- k8s--yml文件3
- python中format函数用于字符串的格式化
python中format函数用于字符串的格式化 通过关键字 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字 grade = {'name' : ...
- pathlib的使用
目录 一. Python2与Python3的路径处理的对比 二. pathlib的几个使用示例 1. 最简单的使用 2. 追加路径到Python的sys.path中 3. 生成目录树的技巧 4. 递归 ...
- Oracle队列实现
Oracle队列实现 -- 核心技术点:for update 创建测试表 create table t ( id number primary key, processed_flag va ...