洛谷—— P2668 斗地主
https://www.luogu.org/problem/show?pid=2668
题目描述
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。
现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。
需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。
具体规则如下:
本题数据随机,不支持hack,要hack或强力数据请点击这里
输入输出格式
输入格式:
第一行包含用空格隔开的2个正整数T和n,表示手牌的组数以及每组手牌的张数。
接下来T组数据,每组数据n行,每行一个非负整数对aibi表示一张牌,其中ai示牌的数码,bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。
输出格式:
共T行,每行一个整数,表示打光第i手牌的最少次数。
输入输出样例
1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1
3
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
6
说明
样例1说明
共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。
对于不同的测试点, 我们约定手牌组数T与张数n的规模如下:
数据保证:所有的手牌都是随机生成的。
DFS每次出的顺子情况,带牌及单出的牌暴力得出步数、
#include <cstring>
#include <cstdio> int n,tot[],tmp[],ans; inline void read(int &x)
{
x=; register char ch=getchar();
for(;ch>''||ch<'';) ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
} int Sum()
{
int card=; //card表示带牌用的步数
memset(tmp,,sizeof(tmp));
for(int i=; i<=; ++i) tmp[tot[i]]++;
for(; tmp[]&&tmp[]>; ) tmp[]--,tmp[]-=,card++; //四带两个对牌
for(; tmp[]&&tmp[]>; ) tmp[]--,tmp[]-=,card++; //四带两个异花单牌
for(; tmp[]&&tmp[]; ) tmp[]--,tmp[]--,card++; //四带两个同花单排
for(; tmp[]&&tmp[]; ) tmp[]--,tmp[]--,card++; //三带一
for(; tmp[]&&tmp[]; ) tmp[]--,tmp[]--,card++; //三代二
return card+tmp[]+tmp[]+tmp[]+tmp[]; //带牌步数+剩余需要单出的牌
} void DFS(int cnt)
{
if(cnt>=ans) return ;
int add=Sum();
ans=ans<(cnt+add)?ans:(cnt+add); for(int i=; i<=; ++i) //三顺子
{
int j=i;
for(; tot[j]>; ) j++;
if(j-i<) continue;
for(int t=i+; t<j; t++)
{
for(int k=i; k<=t; k++) tot[k]-=;
DFS(cnt+);
for(int k=i; k<=t; k++) tot[k]+=;
}
} for(int i=; i<=; ++i) //双顺子
{
int j=i;
for(; tot[j]>; ) j++;
if(j-i<) continue;
for(int t=i+; t<j; t++)
{
for(int k=i; k<=t; k++) tot[k]-=;
DFS(cnt+);
for(int k=i; k<=t; k++) tot[k]+=;
}
} for(int i=; i<=; ++i) //单顺子
{
int j=i;
for(; tot[j]; ) j++;
if(j-i<) continue;
for(int t=i+; t<j; t++)
{
for(int k=i; k<=t; k++) tot[k]--;
DFS(cnt+);
for(int k=i; k<=t; k++) tot[k]++;
}
}
} int Hope()
{
// freopen("my.txt","w",stdout);
int t; read(t),read(n);
for(int col,x; t--; )
{
ans=0x3f3f3f3f;
memset(tot,,sizeof(tot));
for(int i=; i<=n; ++i)
{
scanf("%d%d",&x,&col);
if(x==) x=;
else if(!x) x=;
tot[x]++;
}
DFS();
printf("%d\n",ans);
}
return ;
} int Aptal=Hope();
int main(){;}
洛谷—— P2668 斗地主的更多相关文章
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- [NOIP2015] 提高组 洛谷P2668 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668 斗地主 [NOIP2015]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668斗地主(搜索)noip2015
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668 斗地主
好,终于搞完了这一道毒瘤题...... 先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索. 先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌. 大体思路很简单, ...
- 洛谷 P2668 斗地主
毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...
- 题解【洛谷P2668】[NOIP2015]斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...
- 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668 https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...
- 【noip】跟着洛谷刷noip题
传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...
随机推荐
- Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换
前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...
- 深度学习将会变革NLP中的中文分词——TODO 待好好细看
见:https://www.leiphone.com/news/201608/IWvc75oJglAIsDvJ.html TODO 待好好细看
- hdu 1085(普通母函数)
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- putty和xshell使用和免密登录
putty和xshell使用和免密登录 XSHELL的设置 事前:我们先去关闭防火墙和selinux 关闭防火墙: ufw disable 再去看看selinux 一.查看SELinux状态命令: ...
- Python关于super()函数的理解
看下面的例子: class A: def __init__(self, name): self.name = name def bb(self): print('没事就爱瞎BB') class B(A ...
- Vue组件的三种调用方式
最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然 ...
- vue中子组件需调用父组件通过异步获取的数据
原因:子组件需要调用父组件传过来的数据,如果这个数据是异步从接口里取的,那这个组件在任何生命周期里都取不到,而应该在接口调取后取到. 需要在msg拿到值后才调用组件,然后你在生命周期created里面 ...
- javascript中in运算符的介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android Google 地图 API for Android
从健康类 app Runkeeper 到游戏 app 精灵宝可梦,位置服务对现代 app 来说越来越重要. 在本文中,我们将创建一个 app,名字就叫做 City Guide.这个 app 允许用户搜 ...
- 以shareExtension为例学习iOS扩展开发
整体介绍 phone Extension 用法基础详解 share Extension 用法基础详解 demo链接 密码: i72z