【NOIP】提高组2015 斗地主
【题意】按照斗地主出牌规则,给定手牌求出完的最少步数。
【算法】模拟+搜索
【题解】
可以发现除了顺子,其它的出牌规则都和点数无关,只与同点数的牌数有关。
所以可以先暴力枚举要出哪些顺子,然后每一个出完顺子后手牌的情况处理成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 斗地主的更多相关文章
- 题解——洛谷 P2680 NOIP提高组 2015 运输计划
树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...
- 题解 【luogu P2680 NOIp提高组2015 运输计划】
题目链接 题解 题意 一棵树上有\(m\)条路径,可以将其中一条边的权值改为0,问最长的路径最短是多少 分析 最短的路径最长自然想到二分最长路径,设其为\(dis\) 关键在于如何check chec ...
- 树型大融合——NOIP提高组2015 D1T3 【运输计划】
下午用一个小时看了一下树上差分,打了个差分模板,A了3题,真的爽! 题目描述: 公元2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 ...
- NOIP提高组初赛难题总结
NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...
- NOIP提高组2004 合并果子题解
NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 1043 方格取数 2000 noip 提高组
1043 方格取数 2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...
- [NOIP提高组2018]货币系统
[TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...
- 津津的储蓄计划 NOIp提高组2004
这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...
随机推荐
- 第一次课堂作业---circle
链接:circle
- UVA725 Division (暴力求解法入门)
uva 725 Division Write a program that finds and displays all pairs of 5-digit numbers that between t ...
- LintCode-174.删除链表中倒数第n个节点
删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 样例 给出链表 1->2->3->4->5-> ...
- windows默认TEMP环境
留着是为了等出问题的时候能找着改回来 Administrator 的用户变量 TEMP %USERPROFILE%\AppData\Local\Temp TMP %USERPRO ...
- 织梦CMS建站入门学习(二)
织梦建站的数据库设计: 1.模型表:根据网站的需求,建立不同的数据模型,如:文章浏览,软件下载,视频观看等等. 2.栏目表:根据网站的需求,建立不同的栏目,每一个栏目选择一个数据模型. 3.内容主表: ...
- react-event-pooling
react-event-pooling 事件池 https://codesandbox.io/s/3xp4y9zp7q https://reactjs.org/docs/events.html#eve ...
- 【Json】C#格式化JSON字符串
很多时候我们需要将json字符串以 { "status": 1, "sum": 9 }这种方式显示,而从服务端取回来的时候往往是这样 {&quo ...
- intelliJ IDEA最常用的快捷键
一.使用相关快捷键 1.重写接口实现类:Ctrl+I 2.搜索:Shift+Shift 3.生成get或set方法快捷键:Alt+insert: 4.导入未实现的方法,强制类型转换:Alt+Ent ...
- jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
- bzoj3546[ONTAK2010]Life of the Party
题意是裸的二分图关键点(必然在二分图最大匹配中出现的点).比较经典的做法在cyb15年的论文里有: 前几天写jzoj5007的时候脑补了一种基于最小割可行边的做法:考虑用最大流求解二分图匹配.如果某个 ...