【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插 ...
随机推荐
- 服务器BMC资料整理
1. 现在服务器都有BMC管理了,可以直接连上服务器进行处理. bios里面进行简单设置就可以了, 连接上IPMI的口进行管理. 2. 可以使用 远程控制安装操作系统. 安装系统时 比较清楚的能够看到 ...
- SACD-ISO音频镜像播放方式
SACD-ISO 音频文件不需要解压也不需要挂载光盘,可以直拖入播放器播放. 播放器下载 foobar2000https://www.foobar2000.org/download 解码插件下载 Su ...
- opencv之重映射
好久没写呆码了 今天发个重映射 #include "opencv2/video/tracking.hpp" #include "opencv2/imgproc/imgpr ...
- Java面试题及答案汇总(一)
Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Ru ...
- idea中的调试按键(f5,f6,f7,f8,f9)
f5: 如果断点处存在方法,f5 则强制进入方法内部,然后一步一步执行方法体, 如果再遇到方法,则继续进入方法体,如此循环,直到执行到断点开始处: f6: 从断点处一步步执行以后的代码,会跳出断点所在 ...
- C# vb .net实现玻璃桌子效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的玻璃桌子效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- C# vb .net实现翻转特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的翻转特效效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- springboot自定义消息转换器HttpMessageConverter Spring Boot - 使用Gson替换Jackson
Jackson一直是springframework默认的json库,从4.1开始,springframework支持通过配置GsonHttpMessageConverter的方式使用Gson. 在典型 ...
- Java知识回顾 (13)序列化
本资料来自于runoob,略有修改. 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象. 类 ObjectInputStre ...
- Bootstrap-实现简单的网站首页
html: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...