问题 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组数据,每组数据N行,每行一个非负整数对Ai,Bi,表示一张牌,其中Ai表示牌的数码,Bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。
 

输出

共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考试的更多相关文章

  1. BZOJ 4325: NOIP2015 斗地主

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 684  Solved: 456[Submit][Status] ...

  2. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  3. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝

    [BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...

  4. NOIP2015斗地主[DFS 贪心]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

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

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

  6. LOJ2422 NOIP2015 斗地主 【搜索+贪心】*

    LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...

  7. 2106. [NOIP2015] 斗地主

        2106. [NOIP2015] 斗地主 ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比 时间限制:2 s   内存限制:1025 M ...

  8. 题解【洛谷P2668】[NOIP2015]斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...

  9. 【NOIP2015】斗地主 题解(DFS+贪心)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...

随机推荐

  1. JavaScript严格模式分析

    简要:严格模式(strict mode)是JavaScript在ES5里面新增的编码模式,只要一行代码 就可开启,可谓 非常简单了,而它对于 我们的编码来说到底有什么不同呢? 一. 严格模式的目的? ...

  2. xcode缓存清理

    移除对旧设备的支持 影响:可重新生成:再连接旧设备调试时,会重新自动生成. 路径: ~/Library/Developer/Xcode/iOS DeviceSupport 如果你不是在wb145230 ...

  3. Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  4. Win10《芒果TV》更新v3.8.0初夏版:全新视觉体验,即刻分享视频

    历时半年多昼夜,千呼万唤始出来,Win10版<芒果TV>全平台同步更新初夏版v3.8.0,统一视觉体验,完善分享投屏,进一步提升使用体验. Win10版<芒果TV>V3.8.0 ...

  5. synchronized 专题

    这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synchronized ThreadLocal与 ...

  6. qt技巧--使用html导出表格替代excel

            曾经为qt不能直接导出excel而困扰,后来经过深入了解,得知qt支持xml国际语言,html是xml的一种.html是做网页的,相信大家比较熟悉.所以使用html的<table ...

  7. WPF Build Action

    None: The file is not included in the project output group and is not compiled in the build process. ...

  8. 用TTcpClient和TTcpServer进行文件的传输

    发送数据时有Sendln,SendBuf,SendStream.接收数据时有Receiveln,ReceiveBuf,当时我很奇怪为什么没有ReceiveStream.因为很自然的想到是对应关系的.但 ...

  9. Unity 入門 - 延遲解析

    本文大纲: 小引 共享的范例代码 使用 Lazy<T> 使用自动工厂 注入自定义工厂 小引 当我们说「解析某个型别/组件」时,意思通常是呼叫某类别的建构函式,以建立其实例(instance ...

  10. ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)

    前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了ho ...