NOIP2015斗地主题解 7.30考试
问题 B: NOIP2015 斗地主
时间限制: 3 Sec 内存限制: 1024 MB
题目描述
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:
输入
第一行包含用空格隔开的2个正整数T,N,表示手牌的组数以及每组手牌的张数。
输出
共T行,每行一个整数,表示打光第T组手牌的最少次数。
样例输入
1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1
样例输出
3
提示
共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张
这道题为NOIP2015第一天第三题。属于爆搜类,没有任何算法,就是模拟加爆搜。由于有不同种打法,dfs分为好几层,本着先大后小便于剪枝的原则,先出顺子,再带牌,最后散着出。
首先,花色对结果无影响,其次大小王对结果是否有贡献只看是否出现其中之一,出现结果+1即可,未出现就不必管了(吐槽一下题目描述,没说四带二不算俩王,但测试点中确实不带)。还有一点值得注意的是大小顺序,首先是2不算顺子,其次1比3~13都大,因此可以把大小统一减2,1、2改为12、13便于使用。
先预处理出各个数字(以下都为预处理后的数字)的个数,开始分层爆搜。先提前说明各个数组,la[]为各个数字还剩几个没打,num[i]为数量为i的同数字牌还有几个
第一至三层为顺子,它们可以搜索到自己,因为一套牌可以出现多个顺子,至于顺子的长度,从大到小进行枚举,原理见上然后将搜索完的目标再次指向自己,在函数最后向下一层搜索。
第四,五层为带,四层为四带二,要注意是四带二不是四带一,因为这个卡了55%,带对带单都可以,又因为可以同时出四带两个单和四带两个双,因此需要引入一个bool型变量确认该次搜索由哪里传下来,若为上层则四带双和四带单都单独搜索,四带双继续指向本层,bool改变,只搜四带单,三同理。
第五层就是处理散牌了,不解释。
最后膜拜?大犇,有一个剪枝,若到盖层走的步数以比当前最优解大,则直接返回,貌似省了不少时间。
本来就是搜索题,只能说这些了,其实主要还是代码能力和脑洞。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int t,n,ans=0x7fffffff;
int sum[],la[],num[];
void dfs6(int js){
if(js>=ans)return;
int jj=;
for(int i=;i>=;i--)
jj+=num[i];
ans=min(ans,jj+js);
return;
}
void dfs5(int js,bool pd){ //3 _
if(js>=ans)return;
int nn[];
memcpy(nn,num,sizeof(num));
if(!pd)
{
for(int i=num[];i>=;i--)
{
if(num[]>=i)
{
memcpy(num,nn,sizeof(num));
num[]-=i;
num[]-=i;
dfs5(js+i,);
memcpy(num,nn,sizeof(num));//记得还原,否则判断num[]将会失误。下同。
}
}
}
for(int i=num[];i>=;i--)
{
if(num[]>=i)
{
memcpy(num,nn,sizeof(num));
num[]-=i;
num[]-=i;
dfs6(js+i);
memcpy(num,nn,sizeof(num));
}
}
memcpy(num,nn,sizeof(nn));
dfs6(js);
}
void dfs4(int js,bool pd){ //4 2
if(js>=ans) return;
int nn[];
if(!pd)
{
memset(num,,sizeof(num));
for(int i=;i<=;i++) num[la[i]]++;
memcpy(nn,num,sizeof(num));
for(int i=num[];i>=;i--)
{
if(num[]>=i*)
{
memcpy(num,nn,sizeof(nn));
num[]-=i;
num[]-=i*;
dfs4(js+i,);
memcpy(num,nn,sizeof(nn));
}
}
}
if(pd) memcpy(nn,num,sizeof(num));
for(int i=num[];i>=;i--)
{
if(num[]>=i*)
{
memcpy(num,nn,sizeof(nn));
num[]-=i;
num[]-=i*;
dfs5(js+i,);
memcpy(num,nn,sizeof(nn));
}
}
memcpy(num,nn,sizeof(nn));
dfs5(js,);
}
void dfs3(int js){ //1s
if(js>=ans) return;
int ll[];
memcpy(ll,la,sizeof(la));
for(int l=;l>=;l--)
{
for(int i=;i<=-l+;i++)
{
bool yx=;
for(int j=i;j<=i+l-;j++)
{
if(la[j]<)
{
yx=;
break;
}
}
if(yx)
{
memcpy(la,ll,sizeof(ll));
for(int j=i;j<=i+l-;j++)
{
la[j]-=;
}
dfs3(js+);
memcpy(la,ll,sizeof(ll));
}
}
}
memcpy(la,ll,sizeof(ll));
dfs4(js,);
}
void dfs2(int js){ //2s
if(js>=ans) return;
int ll[];
memcpy(ll,la,sizeof(la));
for(int l=;l>=;l--)
{
for(int i=;i<=-l+;i++)
{
bool yx=;
for(int j=i;j<=i+l-;j++)
{
if(la[j]<)
{
yx=;
break;
}
}
if(yx)
{
memcpy(la,ll,sizeof(ll));
for(int j=i;j<=i+l-;j++)
{
la[j]-=;
}
dfs2(js+);
memcpy(la,ll,sizeof(ll));
}
}
}
memcpy(la,ll,sizeof(ll));
dfs3(js);
}
void dfs1(int js){ //3s
if(js>=ans) return;
int ll[];
memcpy(ll,la,sizeof(la));
for(int l=;l>=;l--)
{
for(int i=;i<=-l+;i++)
{
bool yx=;
for(int j=i;j<=i+l-;j++)
{
if(la[j]<)
{
yx=;
break;
}
} if(yx)
{
memcpy(la,ll,sizeof(ll));
for(int j=i;j<=i+l-;j++)
{
la[j]-=;
}
dfs1(js+);
memcpy(la,ll,sizeof(ll));
}
}
}
memcpy(la,ll,sizeof(ll));
dfs2(js);
}
int main(){
scanf("%d%d",&t,&n);
while(t--)
{
memset(sum,,sizeof(sum));
memset(la,,sizeof(la));
memset(num,,sizeof(num));
ans=0x7fffffff;
int a,b,c,d;
for(int i=;i<=n;i++)
{
int xx,yy;
scanf("%d%d",&xx,&yy);
if(xx==)
xx=;
else if(xx==)
xx=;
else xx-=;
if(xx==-) xx=;
sum[xx]++;
}
memcpy(la,sum,sizeof(sum));
dfs1();
if(sum[]) ans++;
printf("%d\n",ans);
}
//while(1);
return ;
}
NOIP2015斗地主题解 7.30考试的更多相关文章
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- [补档][NOIP2015] 斗地主
[NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 M ...
- 题解【洛谷P2668】[NOIP2015]斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...
- 【NOIP2015】斗地主 题解(DFS+贪心)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...
随机推荐
- Qt SizePolicy 属性(每个控件都有一个合理的缺省sizePolicy。QWidget.size()默认返回值是(640, 480),QWidget.sizeHint()默认返回值是(-1, -1))
控件的sizePolicy说明控件在布局管理中的缩放方式.Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合 所有的布局,开发人员经常需要改变窗体上的某些控件的sizeP ...
- js中的scrollTop、offsetTop、clientTop
scrollHeight:获取对象可滚动的高度. scrollWidth:获取对象可滚动的宽度. scrollTop:获取对象最顶端与对象可见区域最顶端的距离. scrollLeft:获取对象左边界与 ...
- MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establish ...
- Linux下C/C++帮助手册安装方法
1. 安装C的帮助手册 如果你使用的Linux发行版, 默认没有安装C语言的库函数MAN手册, 使用下面的方法解决: # sudo apt-get install manpages # sudo a ...
- 关于这次KPL春季决赛的感悟
QG 4:0 横扫AG超玩会,关于这一点想写一些自己的感悟,AG超玩会一直都是 4:0 横扫别人,这次在冠军赛被别人横扫,一点喘息的机会都没有. 1.QGhappy 跟本没把AG超玩会放在眼里,很 ...
- 管道Demo
使用管道实现读取DOS命令结果,界面如下: 主要代码如下: UpdateData(TRUE); //创建一个管道,用于接收命令执行结果 SECURITY_ATTRIBUTES sa; ZeroMemo ...
- spring boot自定义配置文件
把一些可能会经常变动的东西写在配置文件中,可以增加程序的灵活性,避免多次改版发版. 在sping boot中除了自带的默认配置文件application.properties之外,我们还可以在reso ...
- excel表格处理
xlrd模块 是python中一个第三方的用于读取excle表格的模块,很多企业在没有使用计算机管理前大多使用表格来管理数据,所以导入表格还是非常常用的! exlce结构分析 一个excle表 ...
- hgoi#20190514
T1-Curriculum Vitae 给你一个长度为n的01序列a,删去其中的几个数,使得序列中左边是连续的0,右边是连续的1,可以没有0或1,求最多剩下几个数 解法 对于每个点看它左边几个0,右边 ...
- Redi缓存注意事项
缓存使用的场景 在一个高频访问的应用系统中,每次用户的请求需要去存储中获取数据,会对数据库造成很大的压力.容易导致数据库的奔溃.所以才会出现缓存来分担一部分的数据库的压力. 具体会产生数据库访问压力的 ...