恶心送命模拟题

暴搜顺子,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. tomcat启动时报No rules found matching 'Server/Service/Engine/Host/context'

    tomcat是8.0版本. 在eclipse启动时,第二行报这个, 同时项目也没加载(tomcat启动成功了). 网上搜了半天, 试了半天, 没搞定. 最后不经意间发现: <Context do ...

  2. 长乐国庆集训Day4

    T1 一道数论神题 题目 [题目描述] LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删 ...

  3. 深度剖析java中JDK动态代理机制

    https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...

  4. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

  5. :阿里巴巴 Java 开发手册 (十一)工程结构

    (一) 应用分层 1. [推荐]图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于 Web 层,也可以直接依赖于 Service 层,依此类推:  开放接口层:可直接封装 Se ...

  6. Linux生产环境上,最常用的一套“Sed“技巧

    sed命令应用广泛,使用简单,是快速文本处理的利器.它其实没多少技巧,背诵.使用是最合适的学习渠道,属于硬技能.但它又很复杂,因为高级功能太多.本篇不去关注sed的高级功能,仅对常用的一些操作,进行说 ...

  7. go install -v github.com/gopherjs/gopherjs报错提示go cannot find package "golang.org/x/crypto/ssh/terminal" 解决方案

    1前言 方法一:go get 方法二: github clone 2 方法方法一:go get go get golang.org/x/crypto/ssh/terminal 但是这种方法容易被墙,出 ...

  8. 2019 小米java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.小米等公司offer,岗位是Java后端开发,因为发展原因最终选择去了小米,入职一年时间了,也成为了面试官,之 ...

  9. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  10. ajax的五大步骤

    什么是Ajax? AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. var btn = document.getElementsByTagName('button')[ ...