Description

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:

Input

第一行包含用空格隔开的2个正整数T,N,表示手牌的组数以及每组手牌的张数。

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

Output

共T行,每行一个整数,表示打光第T组手牌的最少次数。

Sample Input

1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1

Sample Output

3

HINT

共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方

片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张
牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。
T<=10
N<=23
  嗯,不剪枝也飞快的。
 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=;
int cnt[N];
int DFS(int d=){
int flag=,ret=;
for(int i=;i<=;i++)
if(cnt[i])flag=;
if(!flag)return ;
for(int i=;i<=;i++){
flag=;
for(int j=i;j<=i+;j++)if(!cnt[j])flag=;
if(!flag)continue;
for(int j=i;j<=i+;j++)cnt[j]-=;
for(int j=i+;j<=;j++){
if(cnt[j]){cnt[j]-=;ret=min(ret,DFS()+);}
else{for(int k=j-;k>=i;k--)cnt[k]+=;break;}
}
} for(int i=;i<=;i++){
flag=;
for(int j=i;j<=i+;j++)if(cnt[j]<)flag=;
if(!flag)continue;
for(int j=i;j<=i+;j++)cnt[j]-=;
for(int j=i+;j<=;j++){
if(cnt[j]>=){cnt[j]-=;ret=min(ret,DFS()+);}
else{for(int k=j-;k>=i;k--)cnt[k]+=;break;}
}
} for(int i=;i<=;i++){
flag=;
for(int j=i;j<=i;j++)if(cnt[j]<)flag=;
if(!flag)continue;
for(int j=i;j<=i;j++)cnt[j]-=;
for(int j=i+;j<=;j++){
if(cnt[j]>=){cnt[j]-=;ret=min(ret,DFS()+);}
else{for(int k=j-;k>=i;k--)cnt[k]+=;break;}
}
} //三带一 三带二
for(int i=;i<=;i++){
if(cnt[i]<)continue;
cnt[i]-=;
for(int j=;j<=;j++){
if(i==j)continue;
if(cnt[j]>=){cnt[j]-=;ret=min(ret,DFS()+);cnt[j]+=;}
if(cnt[j]){cnt[j]-=;ret=min(ret,DFS()+);cnt[j]+=;}
}
cnt[i]+=;
} for(int i=;i<=;i++){
if(cnt[i]<)continue;
cnt[i]-=;
for(int j=;j<=;j++)if(i!=j&&cnt[j]>)
for(int k=j+;k<=;k++)if(i!=k&&cnt[k]>)
{cnt[j]-=;cnt[k]-=;ret=min(ret,DFS()+);cnt[j]+=;cnt[k]+=;} for(int j=;j<=;j++)if(i!=j&&cnt[j])
for(int k=j+;k<=;k++)if(i!=k&&cnt[k])
{cnt[j]-=;cnt[k]-=;ret=min(ret,DFS()+);cnt[j]+=;cnt[k]+=;}
cnt[i]+=;
}
flag=;
for(int i=;i<=;i++)if(cnt[i])flag+=;
return min(ret,flag);
}
int T,n;
int main(){
//freopen("landlords.in","r",stdin);
//freopen("landlords.out","w",stdout);
scanf("%d%d",&T,&n);
while(T--){
memset(cnt,,sizeof(cnt));
for(int i=,a,b;i<=n;i++){
scanf("%d%d",&a,&b);
cnt[a]+=;
}
cnt[]=cnt[];cnt[]=;
printf("%d\n",DFS());
}
return ;
}

基础算法(搜索):NOIP 2015 斗地主的更多相关文章

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

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

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

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

  3. [NOIp 2015]斗地主

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

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

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

  5. [NOIP 2015] 斗地主 landlord

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

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

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

  7. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  8. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  9. 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想

    dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...

随机推荐

  1. WKWebView无法(通过URL schemes)跳转到其他App

    Custom scheme URL 在WKWebView中默认是不支持的 (但Safari可以). 我们可以通过NSError来进行一些处理从而使得程序可以正常跳转: func webView(web ...

  2. IOS开发之KVC与KVO简述

    KVC:Key-Value Coding KVO:Key-Value Observing Person.m #import <Foundation/Foundation.h> @inter ...

  3. JSON.parse 函数应用 (复制备忘)

    JSON.parse 函数 JSON.parse 函数 (JavaScript) 将 JavaScript 对象表示法 (JSON) 字符串转换为对象. 语法 JSON.parse(text [, r ...

  4. Codevs 1172 Hankson 的趣味题 2009年NOIP全国联赛提高组

    1172 Hankson 的趣味题 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Hanks 博 ...

  5. jquery 中的 $("#id") 与 document.getElementById("id") 的区别

    以前没注意过,认为jquery 中的 $("#air") 与 document.getElementById("air") 是一回事,指的是同一个东西.在今天写 ...

  6. Xshell配色方案

    几个比较喜欢的Xshell配色方案,备份记录下 [Names] count=1 name0=SolarizedDark [SolarizedDark] text(bold)=839496 magent ...

  7. 前端工程的构建工具对比 Gulp vs Grunt

    1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...

  8. html5音频和视频相关属性和方法

    方法 方法 描述 addTextTrack() 为音视频加入一个新的文本轨迹 canPlayType() 检查指定的音视频格式是否得到支持 load() 重新加载音视频标签 play() 播放音视频 ...

  9. C#中的反射 Assembly.Load() Assembly.LoadFrom()

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

  10. C++版 Chip8游戏模拟器

    很早就想写个FC模拟器,但真是一件艰难的事情.. 所以先写个Chip8模拟器,日后再继续研究FC模拟器. Chip8只有35条指令,属于RISC指令集,4k内存,2k显存,16个寄存器(其中15个通用 ...