洛谷—— 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:

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说明

共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。

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

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

DFS每次出的顺子情况,带牌及单出的牌暴力得出步数、

 1 #include <cstring>
 2 #include <cstdio>
 3
 4 int n,tot[55],tmp[55],ans;
 5
 6 inline void read(int &x)
 7 {
 8     x=0; register char ch=getchar();
 9     for(;ch>‘9‘||ch<‘0‘;) ch=getchar();
10     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
11 }
12
13
14 int Sum()
15 {
16     int card=0;                //card表示带牌用的步数
17     memset(tmp,0,sizeof(tmp));
18     for(int i=2; i<=16; ++i) tmp[tot[i]]++;
19     for(; tmp[4]&&tmp[2]>1; ) tmp[4]--,tmp[2]-=2,card++;    //四带两个对牌
20     for(; tmp[4]&&tmp[1]>1; ) tmp[4]--,tmp[1]-=2,card++;    //四带两个异花单牌
21     for(; tmp[4]&&tmp[2]; ) tmp[4]--,tmp[2]--,card++;        //四带两个同花单排
22     for(; tmp[3]&&tmp[2]; ) tmp[3]--,tmp[2]--,card++;        //三带一
23     for(; tmp[3]&&tmp[1]; ) tmp[3]--,tmp[1]--,card++;        //三代二
24     return card+tmp[4]+tmp[3]+tmp[2]+tmp[1];        //带牌步数+剩余需要单出的牌
25 }
26
27 void DFS(int cnt)
28 {
29     if(cnt>=ans) return ;
30     int add=Sum();
31     ans=ans<(cnt+add)?ans:(cnt+add);
32
33     for(int i=3; i<=14; ++i)    //三顺子
34     {
35         int j=i;
36         for(; tot[j]>2; ) j++;
37         if(j-i<2) continue;
38         for(int t=i+1; t<j; t++)
39         {
40             for(int k=i; k<=t; k++) tot[k]-=3;
41             DFS(cnt+1);
42             for(int k=i; k<=t; k++) tot[k]+=3;
43         }
44     }
45
46     for(int i=3; i<=14; ++i)    //双顺子
47     {
48         int j=i;
49         for(; tot[j]>1; ) j++;
50         if(j-i<3) continue;
51         for(int t=i+2; t<j; t++)
52         {
53             for(int k=i; k<=t; k++) tot[k]-=2;
54             DFS(cnt+1);
55             for(int k=i; k<=t; k++) tot[k]+=2;
56         }
57     }
58
59     for(int i=3; i<=14; ++i)    //单顺子
60     {
61         int j=i;
62         for(; tot[j]; ) j++;
63         if(j-i<5) continue;
64         for(int t=i+4; t<j; t++)
65         {
66             for(int k=i; k<=t; k++) tot[k]--;
67             DFS(cnt+1);
68             for(int k=i; k<=t; k++) tot[k]++;
69         }
70     }
71 }
72
73 int Hope()
74 {
75 //    freopen("my.txt","w",stdout);
76     int t; read(t),read(n);
77     for(int col,x; t--; )
78     {
79         ans=0x3f3f3f3f;
80         memset(tot,0,sizeof(tot));
81         for(int i=1; i<=n; ++i)
82         {
83             scanf("%d%d",&x,&col);
84             if(x==1) x=14;
85             else if(!x) x=16;
86             tot[x]++;
87         }
88         DFS(0);
89         printf("%d\n",ans);
90     }
91     return 0;
92 }
93
94 int Aptal=Hope();
95 int main(){;}
时间: 2024-10-04 19:36:53

洛谷—— P2668 斗地主的相关文章

洛谷 P2668 斗地主

P2668 斗地主 统计单牌和对牌的数量 然后 凑顺子,能凑就凑 还有四带balabala和三带balabala 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,t,s[15],ans,a,b; 4 5 inline void read(int &now) 6 { 7 char ch=getchar(); now=0; 8 while(ch>'9'||ch<'0') ch=getchar(); 9 while

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

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

洛谷P2668 斗地主 [NOIP2015]

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

洛谷 P2540 斗地主(NOIp2015提高组D1T3)

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

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷P1466 集合 Subset Sums

洛谷P1466 集合 Subset Sums这题可以看成是背包问题 用空间为 1--n 的物品恰好填充总空间一半的空间 有几种方案 01 背包问题 1.注意因为两个交换一下算同一种方案,所以最终 要 f [ v ] / 2 2.要开 long long 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string&g