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张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...
随机推荐
- php如何去掉二维数组中重复的元素
$arr=array( "1"=>array("a","b "), "2"=>array("a&q ...
- HTTP的请求方法一共有9种,有OPTIONS, HEAD, GET, POST等等(消息头有图,十分清楚)
请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定的资源经服务器端解析后 ...
- ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区 1 ArcCatalog使用 1.1 GIS数据 地理信息系统, ...
- 从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“\xE4\xBD...”这种)good
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecFo ...
- C函数实现返回多个值的方法
C语言中,一个函数最多只能实现一个返回值. int func (int b) { int a=5; if (a>b) return a; else return b; return 0; } ...
- Qt5 结构及模块组成?
作为一个Qt的粉丝,对将于明年发布的Qt5充满了期待.可是想想Qt5将发生的巨大变化,心底又有点不安.Qt5到底会变成什么样呢? 看看近期Qt5的一些大动作: 从 QtCore中移除 QSetting ...
- c# 叫号小程序
写个叫号的小demo 长相如下 代码如下 using System; using System.Collections.Generic; using System.ComponentModel; us ...
- QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)
简述 对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态.而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结. 分为下面六种不同情况 客户端网线断开 客户端网 ...
- 第一式、单例模式-Singleton模式(创建型)
一.简介 单例模式主要用的作用是用于保证程序运行中某个类只有一个实例,并提供一个全局入口点.单例模式(Singleton)为GOF阐述的标准24种设计模式中最简单的一个.但随着时间推移,GOF所阐述的 ...
- 基于ASP.NET的新闻管理系统(二)效果展示
5. 新闻管理系统开发与实现 5.1前台新闻页面 主页面 新闻栏展示新闻 搜索新闻 菜单栏链接新闻 后台登录界面 大管理员后台管理界面 小管理员后台管理界面 修改密码 增加新闻界面 栏目管理界面 ...