题目描述

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的 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 行,每行一个整数,表示打光第 i 组手牌的最少次数。

输入输出样例

输入样例#1:
1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1 输出样例#1:
3 输入样例#2:
1 17
12 3
4 3
2 3
5 4
10 2
3 3
12 2
0 1
1 3
10 1
6 2
12 1
11 3
5 2
12 4
2 2
7 2 输出样例#2:
6 题解 爆搜+大模拟:
有人会问:如何爆搜?
并不是真的纯爆搜,只是爆搜顺子,其余的牌贪心去打,注意顺序(代码里有解释);
此题也有一些坑,比如说‘2’不能放在顺子里(我被坑了很久,很少斗地主),这也说明学OI也是需要一些生活经验的; code:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define ll long long
using namespace std; int read(){
int X=,w=; char ch=;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int t,n,ans,ord,x,sum;
int cnt[],a[];
//下面函数都是return 以第i张牌为首能打出顺的最大长度
int danshunzi(int i){
int p=i;
while(cnt[p]>=&&p<=)p++;
if(p-i>=)return p;
return ;
}
int shuangshunzi(int i){
int p=i;
while(cnt[p]>=&&p<=)p++;
if(p-i>=)return p;
return ;
}
int sanshunzi(int i){
int p=i;
while(cnt[p]>=&&p<=)p++;
if(p-i>=)return p;
return ;
}
//打完顺子以后贪心打其他牌的最小次数
//第2个while和第3个while顺序不能换(虽然打出牌的数量一样)
//因为要是单独打单的话需要用两次,而打对需要用一次;
//所以贪心带单
int calc(){
int tot=;
memset(a,,sizeof(a));
for(int i=;i<=;i++)a[cnt[i]]++;//桶套桶 ^-^
while(a[] && a[]>) a[]--,a[]-=,tot++;//
while(a[] && a[]>) a[]--,a[]-=,tot++;// 6
while(a[] && a[]) a[]--,a[]--,tot++;//
while(a[] && a[]) a[]--,a[]--,tot++;//
while(a[] && a[]) a[]--,a[]--,tot++;//
return tot+a[]+a[]+a[]+a[];
} void dfs(int dep){
if(dep>=ans) return;
int k=calc();
ans=min(ans,dep+k);
int pos;
for(int i=;i<=;i++){
if(sanshunzi(i)){ //三顺子 6+
pos=sanshunzi(i);
for(int v=i+;v<=pos-;v++){ //枚举长度
for(int j=i;j<=v;j++) cnt[j]-=;
dfs(dep+);
for(int j=i;j<=v;j++) cnt[j]+=;
}
}
}
for(int i=;i<=;i++){
if(shuangshunzi(i)){ //双顺子 6+
pos=shuangshunzi(i);
for(int v=i+;v<=pos-;v++){
for(int j=i;j<=v;j++) cnt[j]-=;
dfs(dep+);
for(int j=i;j<=v;j++) cnt[j]+=;
}
}
}
for(int i=;i<=;i++){
if(danshunzi(i)){ //单顺子 5+
pos=danshunzi(i);
for(int v=i+;v<=pos-;v++){
for(int j=i;j<=v;j++) cnt[j]--;
dfs(dep+);
for(int j=i;j<=v;j++) cnt[j]++;
}
}
}
} int main()
{
freopen("cards.in","r",stdin);
freopen("cards.out","w",stdout);
t=read();n=read();
while(t--){
ans=;
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;i++){
x=read();ord=read();
if(x==)x=; // A
else if(x) x--; // 1对应2 2对应3 .......
cnt[x]++; // 这样存可以解决2不能在顺子里的坑
}
dfs();
printf("%d\n",ans);
}
return ;
}
我觉得我该斗两把地主了 ^-^
												

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

  1. Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)

    Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...

  2. 基础算法(搜索):NOIP 2015 斗地主

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

  3. [BZOJ 4325][NOIP 2015] 斗地主

    一道防AK好题 4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 820  Solved: 560[Submit] ...

  4. [NOIp 2015]斗地主

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

  5. [NOIP 2015] 斗地主 landlord

    想起几个月之前的 noip2015-只会瞎搞-这道题骗了 30 分.T T 题目 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌 ...

  6. noip 2015 斗地主 大爆搜!!!

    反正肯定是大模拟 但是每一个可以出的牌都搜一定不是最优的 考虑最特殊的出牌方案:顺子(单,对,三) 每一种方案再加上暴力贪心打出剩下的牌的步数 #include<cstdio> #incl ...

  7. 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心

    题目:https://www.luogu.org/problemnew/show/P2668   https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...

  8. 4632 NOIP[2015] 运输计划

    4632 NOIP[2015] 运输计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解       题目描述 Description 公元 2044 ...

  9. NOIP 2015

    Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...

  10. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

随机推荐

  1. redis学习三 redis持久化

      1,快照持久化 1简介      redis可以通过创建快照来获得某个时间点上的内存内容的数据副本,有了副本之后,就可以将副本发送到其他redis服务器上从而创建相同数据的从服务器,同时快照留在原 ...

  2. List的使用1(两张表或者一张表的自身关系)

    第一,在Model中 首先,在视图Model(GZUModel)中定义一个SelectListItem集合 public List<SelectListItem> AList { get; ...

  3. Java enum(枚举)使用详解之四

    用法五:实现接口 所有的枚举都继承自java.lang.Enum类.由于Java 不支持多继承,所以枚举对象不能再继承其他类. public interface Behaviour { void pr ...

  4. 问题:C#打开一个文本文档往里面写数据,没有就新建文档 ;结果:c#FileStream文件读写(转)

    FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字节的方法,但经常使用StreamReader或 StreamWriter执行这些功能.这是因为FileStream ...

  5. DAY9-python并发之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  6. Oracle之DBMS_SQL包用法详解

    对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:open  cursor--->parse---> bind  variable  ---> defi ...

  7. CloudNote

    目录 406错误 spring+mybatis建立连接失败 生成文档的乱码问题 服务器接收ajax发送的请求参数时出现乱码 获取不到cookie数据 1 利用Jackson返回json字符串时出现错误 ...

  8. p4570 [BJWC2011]元素

    传送门 分析 对法力值从大到小排序然后对编号跑线性基即可 代码 #include<iostream> #include<cstdio> #include<cstring& ...

  9. loj10093 网络协议

    传送门 分析 第一问我们不难想出是缩点之后的新图中入度为0的点的个数,对于第二问,我们画一画可以发现最优策略就是对于每一个入度为0的点都有一个出度为0的点连向它,而对于每一个出度为0的点也一定连向一个 ...

  10. opencv中读写视频

    1.介绍 OpenCV 读写视频之前,先介绍一下编解码器(codec) .如果是图像文件, 我们可以根据文件扩展名得知图像的格式.但是此经验并不能推广到视频文件中. 有些 OpenCV 用户会碰到奇怪 ...