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. struts2类型转换中的错误处理

    由于类型转换过程中有可能出现原始参数无法转换为目标类型的错误,所以struts2提供了类型转换中的异常处理机制. 在struts2的默认配置文件struts-default.xml中有如下一段配置代码 ...

  2. VB,VBS,VBA,ASP可引用的库参考

    文件系统对象相关: ("SCRIPTING.FILESYSTEMOBJECT") 字典相关: ("SCRIPTING.DICTIONARY") 脚本外壳相关:  ...

  3. POJ 2711 Regular Words(DP + 高精度)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1711 题目大意:给定一个正整数n,产生一个3*n位长的串,要求这个串 ...

  4. mysql学习笔记2

    drop database 数据库名称;————删除数据库 show columns from 数据表名[from 数据库名]:(或者 show columns from 数据库.数据表名:)———— ...

  5. 最近使用Qt遇到的一些小问题解决办法总结

    1. 我想获取当前星期几这样的,我没在API里面找到这样的函数,但是我找到了今天是第几天这样的,所以自己转换一下就OK了: typedef struct { int numInWeek; QStrin ...

  6. 完整的 AJAX 写法(支持多浏览器)

    代码如下: <script type="text/javascript"> var xmlhttp; function Submit() { //1.创建 XMLHtt ...

  7. 网络安全设备Bypass功能介绍及分析

    from:http://netsecurity.51cto.com/art/200910/159948.htm 网络安全平台厂商往往需要用到一项比较特殊的技术,那就是Bypass,那么到底什么是Byp ...

  8. 【转】Oracle中dual表的用途介绍

    原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表, ...

  9. HTML新元素

    <canvas> 标签定义图形,比如图表和其他图像.该标签基于 JavaScript 的绘图 API <audio> 定义音频内容 <video> 定义视频(vid ...

  10. 最新县及县以上行政区划代码JSON数据(截止2015年9月30日)含经纬度数据

    数据来源(国家统计局):http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/ 对数据进行的特殊处理: 将直辖市中的 “市辖区” 与 “县” 合并到区域 将 “省直辖县级行 ...