恶心送命模拟题

暴搜顺子,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 及 增强版 (送命题)的更多相关文章

  1. Luogu 2540 斗地主增强版(搜索,动态规划)

    Luogu 2540 斗地主增强版(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游 ...

  2. P2540 斗地主增强版

    P2540斗地主增强版 参考大佬题解 思路:顺子暴力搜,剩下的牌我不会贪心所以用记忆化搜索(或者dp): 注意:双王不能当对,二不算顺子 代码 #include <cstdio> #inc ...

  3. 洛谷 题解 P2540 【斗地主增强版】

    [分析] 暴力搜顺子,贪心出散牌 为什么顺子要暴力? 玩过斗地主的都知道,并不是出越长的顺子越好,如果你有一组手牌,3,4,5,6,7,6,7,8,9,10,你一下把最长的出了去,你会单两张牌,不如出 ...

  4. [Luogu2540][NOIP2016]斗地主增强版(搜索+DP)

    增强版就是原版中两鬼不算对子的版本. 先爆搜出完所有对子,剩下的牌DP处理. 考虑每个数码的拆牌情况,最多可能被拆成5种情况:1+1+1+1,1+1+2,1+3,2+2,4.故DP状态数最多为5^13 ...

  5. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  6. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  7. HLJU 1046: 钓鱼(数据增强版) (贪心+优化)

    1046: 钓鱼(数据增强版) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 11  Solved: 3 [id=1046">Subm ...

  8. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  9. 最新GHOST XP系统下载旗舰增强版 V2016年

    系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...

随机推荐

  1. [转帖]rename(Perl语言版本) 详解

    rename(Perl语言版本) 详解 2019-03-19 22:51:23 wayne17 阅读数 464更多 分类专栏: Ubuntu之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  2. Versioning information could not be retrieved from the NuGet package repository. Please try again later.

    Versioning information could not be retrieved from the NuGet package repository. Please try again la ...

  3. python ---socket初识

    python网络编程(初识) 一些概念 套接字: 套接字(socket)也叫通信端点,最初用于计算机内部进程之间的通信,而随着网络的发展,套接字被用于计算机之间的通信.举个例子,你(是一台计算机)要打 ...

  4. 文件和异常练习——python编程从入门到实践

    10-1 Python学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学习到的python知识,其中每一行都以“In Python you can”打头.将这和文件命名为learning ...

  5. sublime配置python环境及快捷键

    sublime配置python环境 参考链接:https://blog.csdn.net/VertigozZ/article/details/54574006 快捷键的配置:https://www.c ...

  6. Jenkins+Gitlab配置Webhook实现提交自动部署

    一.概述 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 已经实现了 Jenkins+harbor+gitlab+ ...

  7. @SuppressWarnings注解用法

    @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 如图所示: 这时候我们在方法上加上@SuppressWarnings ...

  8. 华为、华三 交换机 开启SNMP 简单网络管理协议

    [huawei]snmp-agent //使能SNMP代理 [huawei]snmp-agent sys-info version all //允许所有SNMP 支持 协议 [huawei]snmp- ...

  9. 两台Windows的 IIS 应用站点 基于NLB + ARR 实现双机热备和负载

    IIS负载均衡中我们使用微软的ARR,但提到网站的高可用性,ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给down掉啦,那么做再多的应用服务集群也都枉然. 这里我们主要针对解决这一 ...

  10. volatile-最轻量级的并发实现及其内存语义

    原文连接:(http://www.studyshare.cn/blog/details/1163/0 ) 一.volatile定义 volatile是java并发编程中修饰类的成员变量.成员属性或者对 ...