【题意】按照斗地主出牌规则,给定手牌求出完的最少步数。

【算法】模拟+搜索

【题解】

可以发现除了顺子,其它的出牌规则都和点数无关,只与同点数的牌数有关。

所以可以先暴力枚举要出哪些顺子,然后每一个出完顺子后手牌的情况处理成b[4]表示牌数为1~4的点数有多少个,然后进行dfs。(为了方便,将A接在14,然后注意2不能顺)

dfs(s,t,j,z)表示有s组牌数为1,有t组牌数为2,有j组牌数为3,有z组牌数为4的情况出完手牌的最少步数。(可以记忆化)

然后在dfs讨论一下【单打】【拆牌】【带牌】三种情况,对应转移就可以了。(数据小,写多暴力都没关系)

双王在进入dfs前特殊处理:有双王就考虑多一种当炸弹打的情况,然后就直接将王当作单排进入dfs。

代码已通过各大OJ增强版(>w<)。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=,inf=0x3f3f3f3f;
const int limit[]={,,,};
int f[maxn][maxn][maxn][maxn],a[maxn],b[maxn];
int min(int a,int b){return a<b?a:b;}
int dfs(int s,int t,int j,int z){
if(~f[s][t][j][z])return f[s][t][j][z];
int ans=inf;
if(t)ans=min(ans,dfs(s+,t-,j,z));
if(j)ans=min(ans,dfs(s+,t+,j-,z));
if(z)ans=min(ans,min(dfs(s,t+,j,z-),dfs(s+,t,j+,z-)));
if(j&&s)ans=min(ans,dfs(s-,t,j-,z)+);
if(j&&t)ans=min(ans,dfs(s,t-,j-,z)+);
if(z&&s>)ans=min(ans,dfs(s-,t,j,z-)+);
if(z&&t>)ans=min(ans,dfs(s,t-,j,z-)+);
return f[s][t][j][z]=min(ans,s+t+j+z);
}
int calc(int step){
int ans=inf,tot;
for(int k=;k<=;k++){
for(int i=;i<=;i++){
tot=;
for(int j=i;j<=;j++)if(a[j]>=k)tot++;else break;
for(int j=i+limit[k]-;j<=i+tot-;j++){
for(int l=i;l<=j;l++)a[l]-=k;
ans=min(ans,calc(step+));
for(int l=i;l<=j;l++)a[l]+=k;
}
}
}
b[]=b[]=b[]=b[]=;
for(int i=;i<=;i++)b[a[i]]++;
if(a[]==)ans=min(ans,step++dfs(b[],b[],b[],b[]));
b[]+=a[];
ans=min(ans,step+dfs(b[],b[],b[],b[]));
return ans;
}
int main(){
int T,n;
scanf("%d%d",&T,&n);
memset(f,-,sizeof(f));
f[][][][]=;
while(T--){
int u,v;
memset(a,,sizeof(a));
for(int i=;i<=n;i++){
scanf("%d%d",&u,&v);
a[u]++;
}
a[]=a[];
printf("%d\n",calc());
}
return ;
}//thanks for Lucius's code!

【NOIP】提高组2015 斗地主的更多相关文章

  1. 题解——洛谷 P2680 NOIP提高组 2015 运输计划

    树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...

  2. 题解 【luogu P2680 NOIp提高组2015 运输计划】

    题目链接 题解 题意 一棵树上有\(m\)条路径,可以将其中一条边的权值改为0,问最长的路径最短是多少 分析 最短的路径最长自然想到二分最长路径,设其为\(dis\) 关键在于如何check chec ...

  3. 树型大融合——NOIP提高组2015 D1T3 【运输计划】

    下午用一个小时看了一下树上差分,打了个差分模板,A了3题,真的爽! 题目描述: 公元2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 ...

  4. NOIP提高组初赛难题总结

    NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...

  5. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  6. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  7. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  8. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  9. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

随机推荐

  1. poj 3009 (深搜求最短路)

    题目大意就是求在特定规则下的最短路,这个规则包含了消除障碍的操作.用BFS感觉选择消除障碍的时候不同路径会有影响,用DFS比较方便状态的还原(虽然效率比较低),因此这道题目采用DFS来写. 写的第一次 ...

  2. WPF+数据库+三层

    1.计算类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...

  3. JavaScript初探系列之基本概念

    JavaScript的核心语言特性在ECMA-262中是以名为ECMAScript(ECMA, EuropeanComputer Manufacturers Association )的伪语言的形式来 ...

  4. android BadgeView的使用(图片上的文字提醒)

    BadgeView主要是继承了TextView,所以实际上就是一个TextView,底层放了一个label,可以自定义背景图,自定义背景颜色,是否显示,显示进入的动画效果以及显示的位置等等: 这是Gi ...

  5. iOS- iOS 和 Android 的后台推送原理各是什么?有什么区别?

    iOS 的推送iOS 在系统级别有一个推送服务程序使用 5223 端口.使用这个端口的协议源于 Jabber 后来发展为 XMPP ,被用于 Gtalk 等 IM 软件中.所以, iOS 的推送,可以 ...

  6. matlab的二维卷积操作(转)

    MATLAB的conv2函数实现步骤(conv2(A,B)): 其中,矩阵A和B的尺寸分别为ma*na即mb*nb ① 对矩阵A补零,第一行之前和最后一行之后都补mb-1行,第一列之前和最后一列之后都 ...

  7. Ansys Workbench热流固耦合仿真配置

    1.Fluent-Thermal-Structural瞬态分析 此模块连接在fluent已实现流体和固体的热流耦合,传递至thermal实际上只是将流体表面温度作为热载荷施加在固体的液体通道表面,极大 ...

  8. 【EF Core】Entity Framework Core 批处理语句

    在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...

  9. 【MVC】ASP.NET MVC5 使用MiniProfiler 监控MVC性能

    MiniProfiler ,一个简单而有效的迷你剖析器,可以有效的实时监控页面.通过直接引用.Ajax.Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL. ...

  10. java从远程服务器获取PDF文件并后台打印(使用pdfFox)

    一.java原生方式打印PDF文件 正反面都打印,还未研究出只打印单面的方法,待解决 public static void printFile(String path) throws Exceptio ...