题目描述

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏。在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王3<4<5<6<7<8<9<10<J<Q<K<A<2<\text{小王}<\text{大王}3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 nnn 张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。

现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。

需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:

本题数据随机,不支持hack,要hack或强力数据请点击这里

输入输出格式

输入格式:

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

接下来 TTT 组数据,每组数据 nnn 行,每行一个非负整数对 ai,bia_i,b_iai​,bi​ ,表示一张牌,其中 aia_iai​ 表示牌的数码, bib_ibi​ 表示牌的花色,中间用空格隔开。特别的,我们用 111 来表示数码 AAA, 111111 表示数码J JJ, 121212 表示数码Q QQ, 131313 表示数码 KKK;黑桃、红心、梅花、方片分别用 1−41-41−4 来表示;小王的表示方法为 010101 ,大王的表示方法为 020202 。

输出格式:

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

输入输出样例

输入样例#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

说明

样例1说明

共有111组手牌,包含8张牌:方片777,方片888,黑桃999,方片101010,黑桃JJJ,黑桃555,方片AAA以及黑桃AAA。可以通过打单顺子(方片777,方片888,黑桃999,方片101010,黑桃JJJ),单张牌(黑桃555)以及对子牌(黑桃AAA以及方片AAA)在333次内打光。

对于不同的测试点, 我们约定手牌组数TTT与张数nnn的规模如下:

数据保证:所有的手牌都是随机生成的。


其实只需要一个剪枝,在暴力穷举完不定长的出法之后按照从多到少的顺序枚举定长的出法,每次枚举前判断如多剩余卡牌数除以当前状态最多一次出牌数大于当前最佳答案直接\(return\)

我的第一个行数\(200+\)的代码<( ̄︶ ̄)>


#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; int i,m,n,j,k,a[101],t,g,h,ans=0x3f3f3f3f; void dfs(int k,int *d,int res,int num)
{
if(num==1)
for(int i=3;i<=13;i++)
{
if((d[i]<3)||(d[i+1]<3)) continue;
d[i]-=3; res-=3;
int t=1;
while(d[i+t]>=3)
{
d[i+t]-=3;
res-=3;
dfs(k+1,d,res,1);
t+=1;
}
while(t--) d[t+i]+=3,res+=3;
}
if(num==1)
for(int i=3;i<=12;i++)
{
if((d[i]<2)||(d[i+1]<2)||(d[i+2]<2)) continue;
d[i]-=2; d[i+1]-=2; res-=4;
int t=2;
while(d[i+t]>=2)
{
d[i+t]-=2;
res-=2;
dfs(k+1,d,res,1);
t+=1;
}
while(t--) d[t+i]+=2,res+=2;
}
if(num==1)
for(int i=3;i<=10;i++)
{
if((!d[i])||(!d[i+1])||(!d[i+2])||(!d[i+3])||(!d[i+4])) continue;
d[i]-=1; d[i+1]-=1; d[i+2]-=1; d[i+3]-=1; res-=4;
int t=4; while(d[i+t])
{
d[i+t]-=1;
res-=1;
dfs(k+1,d,res,1);
t+=1;
}
while(t--)
d[i+t]+=1,res+=1;
} if(res/8+k>=ans) return;
for(int i=3;i<=16;i++)
{
if(d[i]<4) continue;
d[i]-=4;
res-=4;
for(int j=3;j<=16;j++)
if(d[j]>=2)
for(int l=j;l<=16;l++)
if(((j==l)&&(d[l]>=4))||((j!=l)&&(d[l]>=2)))
{
d[l]-=2; d[j]-=2; res-=4;
dfs(k+1,d,res,0);
d[l]+=2; d[j]+=2; res+=4;
}
res+=4;
d[i]+=4;
} if(res/6+k>=ans) return;
for(int i=3;i<=16;i++)
{
if(d[i]<4) continue;
d[i]-=4; res-=4;
for(int j=3;j<=17;j++)
if(d[j])
for(int l=j;l<=17;l++)
if(((j==l)&&(d[l]>=2))||((j!=l)&&(d[l])))
{
d[l]-=1; d[j]-=1; res-=2;
dfs(k+1,d,res,0);
d[l]+=1; d[j]+=1; res+=2;
}
res+=4; d[i]+=4;
} if(res/5+k>=ans) return;
for(int i=3;i<=16;i++)
{
if(d[i]<3) continue;
d[i]-=3; res-=3;
for(int j=3;j<=16;j++)
if(d[j]>1)
{
d[j]-=2; res-=2;
dfs(k+1,d,res,0);
d[j]+=2; res+=2;
}
res+=3; d[i]+=3;
} if(res/4+k>=ans) return;
for(int i=3;i<=16;i++)
{
if(d[i]<3) continue;
d[i]-=3; res-=3;
for(int j=3;j<=17;j++)
if(d[j])
{
d[j]-=1; res-=1;
dfs(k+1,d,res,0);
d[j]+=1; res+=1;
}
res+=3; d[i]+=3;
} if(res/3+k>=ans) return;
for(int i=3;i<=16;i++)
{
if(d[i]<3) continue;
d[i]-=3; res-=3;
dfs(k+1,d,res,0);
res+=3; d[i]+=3;
} if(res/2+k>=ans) return;
for(int i=3;i<=17;i++)
{
if(d[i]<2) continue;
d[i]-=2; res-=2;
dfs(k+1,d,res,0);
res+=2; d[i]+=2;
} ans=min(ans,k+res); } int main()
{
scanf("%d%d",&t,&n);
for(t;t>=1;t--)
{
memset(a,0,sizeof(a));
ans=0x3f3f3f3f;
for(i=1;i<=n;i++)
{
scanf("%d%d",&g,&h);
if(g==0) a[17]+=1;
else if(g==2) a[16]+=1;
else if(g==1) a[14]+=1;
else a[g]+=1;
}
dfs(0,a,n,1);
printf("%d\n",ans);
} }

加强版会被hack掉一个点T到爆炸...QAQ

P2668 斗地主的更多相关文章

  1. 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]

    P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...

  2. Luogu P2668 斗地主(NOIP2015)

    还记得那道我只用特判得了30分的"斗地主"吗? 我今天脑抽打算把它改A掉.为什么不用这大好时光去干些更有意义的事 于是我就挖了这个坑. 题解: 题目链接:P2668 斗地主 本题就 ...

  3. [NOIP2015] 提高组 洛谷P2668 斗地主

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

  4. 洛谷P2668 斗地主 [NOIP2015]

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

  5. P2668 斗地主 dp+深搜版

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

  6. P2668 斗地主 贪心+深搜

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

  7. 洛谷P2668斗地主(搜索)noip2015

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

  8. 洛谷—— P2668 斗地主

    https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...

  9. 洛谷P2668 斗地主

    好,终于搞完了这一道毒瘤题...... 先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索. 先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌. 大体思路很简单, ...

随机推荐

  1. 今天瞎写的关于XML的一些。

    using System;using System.Windows.Forms;using System.Xml; namespace winformDemo{    public partial c ...

  2. 在ASP.NET中过滤HTML字符串总结

    先记下来,以作备用! ///   <summary>去除HTML标记 /// ///   </summary> ///   <param name="Htmls ...

  3. 撩课-Java每天5道面试题第15天

    撩课Java+系统架构点击开始学习 106.什么是Hibernate的并发机制?怎么去处理并发问题? a.Hibernate的Session对象是非线程安全的, 对于单个请求,单个会话, 单个的工作单 ...

  4. 前端(十一):props、state及redux关系梳理

    所谓状态机,是一种抽象的数据模型,是“事物发展的趋势”,其原理是事件驱动.广泛地讲,世界万物都是状态机. 一.状态机是一种抽象的数据模型 在react中,props和state都可以用来传递数据.这里 ...

  5. code.google.com certificate error: certificate is for www.google.com

    有时候我们会碰到下面错误:code.google.com certificate error: certificate is for www.google.com,类似如下: D:\>go ge ...

  6. poj 2002 Squares 几何二分 || 哈希

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 5749 Descript ...

  7. Struts2 (四) — 拦截器

    一.拦截器 1.概述 1.1什么是拦截器 ​ 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象. ​ 拦截器有点类似以前Servlet阶段的Filter(过滤器 ...

  8. C#学习笔记-原型模式

    题目:编写基本的简历. 实现: 创建基本的Resume类,然后主函数通过实例化Resume来写简历即可. Resume类: class Resume { private string name; pr ...

  9. Tarjan系列1

    tajan的dfs树系列算法: 求解割点,桥,强连通分量,点双联通分量,边双联通分量: tajan是一个dfs,把一个图变成一个dfs树结构, dfs树结构,本质是通过一个没有任何要求的dfs把图的边 ...

  10. [SD2015]序列统计——solution

    http://www.lydsy.com/JudgeOnline/problem.php?id=3992 很容易得出DP方程: f[i][c]=f[i-1][a]*f[1][b]① 其中a*b%M=c ...