基础算法(搜索):NOIP 2015 斗地主
Description
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:
Input
第一行包含用空格隔开的2个正整数T,N,表示手牌的组数以及每组手牌的张数。
Output
共T行,每行一个整数,表示打光第T组手牌的最少次数。
Sample Input
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1
Sample Output
HINT
共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方
#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 斗地主的更多相关文章
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668 https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...
- [NOIp 2015]斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [BZOJ 4325][NOIP 2015] 斗地主
一道防AK好题 4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 820 Solved: 560[Submit] ...
- [NOIP 2015] 斗地主 landlord
想起几个月之前的 noip2015-只会瞎搞-这道题骗了 30 分.T T 题目 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌 ...
- noip 2015 斗地主 大爆搜!!!
反正肯定是大模拟 但是每一个可以出的牌都搜一定不是最优的 考虑最特殊的出牌方案:顺子(单,对,三) 每一种方案再加上暴力贪心打出剩下的牌的步数 #include<cstdio> #incl ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
随机推荐
- Deep Learning 学习随记(三)续 Softmax regression练习
上一篇讲的Softmax regression,当时时间不够,没把练习做完.这几天学车有点累,又特别想动动手自己写写matlab代码 所以等到了现在,这篇文章就当做上一篇的续吧. 回顾: 上一篇最后给 ...
- IOS之沙盒(Sandbox)机制
IOS中每个App应用程序都有一个单独封闭的文件夹,这个文件夹称为沙盒,并且苹果规定,任何App都无权访问其他App的沙盒 沙盒目录通过 FOUNDATION_EXPORT NSString *NSH ...
- 使用jeesite org.springframework.beans.NotReadablePropertyException: Invalid property 'tfxqCmsAccount.id' of bean class
一对多 对子表添加时在form表单 path="tfxqCmsAccount.id"页面报错,对比了下其他可行的,发现其自动生成的子类少了个构造方法 加上 public TfxqC ...
- VIM 及正则表达式
VIM及正则表达式 一.查找/Search + 统计 1.统计某个关键字 方法是:%s:keyword:&:gn. 其中,keyword是要搜索的关键字,&表示前面匹配的字符串,n表示 ...
- [Caffe] ubuntu14.04下使用OpenBLAS加速Caffe
一.apt安装 sudo apt-get install libopenblas-dev 二.手动从source安装 1. 下载OpenBLAS并编译 git clone https://github ...
- 安装交叉编译arm-linux-gcc环境
设置好交叉编译的执行文件路径贴加到环境变量PATH 设置如下 export PATH=$PATH:/XXX/XXX/bin /etc/profile /~/.bashrc source /etc/p ...
- html5生成柱状图(条形图)
<html> <canvas id="a_canvas" width="1000" height="700">< ...
- 4种方法生成二维码 (js 控制canvas 画出 二维码)
随着网络的迅速发展 发展 发展,二维码的应用将会越来越多.同时很多只是很平凡的二维码,请拿起你的手 把这个二维码 设计起来吧.下面分享了几个非常好的二维码设计. 二维码原理: 二维条码/二维码可以分 ...
- DM8168 环境搭建(1)
参考<DM81xx_DVR_RDK_Install_Guide.pdf> location:/dvrrdk/DVRRDK_04.01.00.02/dvr_rdk/docs 1,准备工作: ...
- 有很多功能交给IIS实现就好了啊,之前干嘛要自己写?
比方说设置默认主页啊,错误页伪静态之类的