掌握魔法の东东 II Gym-270437

2023-05-16

题目
从瑞神家打牌回来后,东东痛定思痛,决定苦练牌技,终成赌神!
东东有 A × B 张扑克牌。每张扑克牌有一个大小(整数,记为a,范围区间是 0 到 A - 1)和一个花色(整数,记为b,范围区间是 0 到 B - 1。
扑克牌是互异的,也就是独一无二的,也就是说没有两张牌大小和花色都相同。
“一手牌”的意思是你手里有5张不同的牌,这 5 张牌没有谁在前谁在后的顺序之分,它们可以形成一个牌型。 我们定义了 9 种牌型,如下是 9 种牌型的规则,我们用“低序号优先”来匹配牌型,即这“一手牌”从上到下满足的第一个牌型规则就是它的“牌型编号”(一个整数,属于1到9):

同花顺: 同时满足规则 2 和规则 3.
顺子 : 5张牌的大小形如 x, x + 1, x + 2, x + 3, x + 4
同花 : 5张牌都是相同花色的.
炸弹 : 5张牌其中有4张牌的大小相等.
三带二 : 5张牌其中有3张牌的大小相等,且另外2张牌的大小也相等.
两对: 5张牌其中有2张牌的大小相等,且另外3张牌中2张牌的大小相等.
三条: 5张牌其中有3张牌的大小相等.
一对: 5张牌其中有2张牌的大小相等.
要不起: 这手牌不满足上述的牌型中任意一个.

现在, 东东从A × B 张扑克牌中拿走了 2 张牌!分别是 (a1, b1) 和 (a2, b2). (其中a表示大小,b表示花色)
现在要从剩下的扑克牌中再随机拿出 3 张!组成一手牌!!
其实东东除了会打代码,他业余还是一个魔法师,现在他要预言他的未来的可能性,即他将拿到的“一手牌”的可能性,我们用一个“牌型编号(一个整数,属于1到9)”来表示这手牌的牌型,那么他的未来有 9 种可能,但每种可能的方案数不一样。
现在,东东的阿戈摩托之眼没了,你需要帮他算一算 9 种牌型中,每种牌型的方案数。

input
第 1 行包含了整数 A 和 B (5 ≤ A ≤ 25, 1 ≤ B ≤ 4).

第 2 行包含了整数 a1, b1, a2, b2 (0 ≤ a1, a2 ≤ A - 1, 0 ≤ b1, b2 ≤ B - 1, (a1, b1) ≠ (a2, b2)).

output
输出一行,这行有 9 个整数,每个整数代表了 9 种牌型的方案数(按牌型编号从小到大的顺序)

Examples
input
5 2
1 0 3 1
output
0 8 0 0 0 12 0 36 0

input
25 4
0 0 24 3
output
0 0 0 2 18 1656 644 36432 113344

解题思路
题目很长,我们需要求出9种牌的组合数。

1.每一种组合我们最好就是9种情况都比较过,这样每种组合就只需要遍历一次。

2.最好用一个数组来储存每一种牌的数量,这样比较好进行数量的比较。

代码实现

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int A,B,a1,a2,b1,b2;
struct pai{   //牌的结构体
	int a,b;
	bool operator<(const pai &p)
	{
		if(a!=p.a)  return a<p.a;
		else return b<p.b;
	}
};
pai p[150];int pi;
int sum[10];  //每种多少组 
pai ppp[5];   //一组牌
void add(int i,int j)   //加牌 
{
	pai p1;p1.a=i,p1.b=j;
	p[pi++]=p1;
}

pai a_,b_;
bool _2(pai i,pai j,pai k)   //顺子 
{
	ppp[0]=a_,ppp[1]=b_,ppp[2]=i,ppp[3]=j,ppp[4]=k;
	sort(ppp,ppp+5);
	int x = ppp[0].a;
	for(int g=0;g<5;g++)
	{
		if(x!=ppp[g].a) return 0;
		x++; 
	}
	return 1;
}
bool _3(pai i,pai j,pai k)  //同花 
{
	ppp[0]=a_,ppp[1]=b_,ppp[2]=i,ppp[3]=j,ppp[4]=k;
	for(int l=0;l<4;l++)
	{
		if( ppp[l].b !=ppp[l+1].b )  return 0;
	}
	return 1;
}
bool _456789(pai i,pai j,pai k)  
{
	ppp[0]=a_,ppp[1]=b_,ppp[2]=i,ppp[3]=j,ppp[4]=k;
	int c[5];  //装这组牌的大小
	c[0]=a_.a,c[1]=b_.a,c[2]=i.a,c[3]=j.a,c[4]=k.a;
	int count[5];//每种大小的个数
	for(int g=0 ;g<5;g++) count[g]=0;
	for(int g=0;g<5;g++)
	{
		for(int h=0;h<5;h++)
		{
			if( ppp[g].a == c[h] )  count[g]++;
		}
	}
	for(int g=0;g<5;g++)
	{//如果有4张相等
		if(count[g]==4) {sum[4]++;return 1;}   //炸弹 
	}
	bool flag1=0,flag2=0;
	for(int g=0;g<5;g++)
	{
		if(count[g]==3) 
		flag1=1;
		else if(count[g]==2)
		flag2=1;
	}//如果有3张相等,2张相等
	if(flag1 && flag2) {sum[5]++;return 1;}   //三带二 
	int flag=0;
	for(int g=0;g<5;g++)
	{
		if(count[g]==2)          
		flag++;
	}  //如果有2对相等,那么count应该为 2 2 2 2 1
	if(flag == 4)  {sum[6]++;return 1;}   //两对  2 2 2 2 1

	for(int g=0;g<5;g++)
	{
		if(count[g]==3)          
		{sum[7]++;return 1;}        //三条 
	}

	for(int g=0;g<5;g++)
	{
		if(count[g]==2)          
		{sum[8]++;return 1;}        //一对 
	}
	return 0;   //要不起 
} 
int main()
{
	ios::sync_with_stdio(0);
	cin>>A>>B;
	cin>>a1>>b1>>a2>>b2;
	a_.a=a1,a_.b=b1; b_.a=a2,b_.b=b2;
	for(int i=0;i<A;i++)
	{
		for(int j=0;j<B;j++)
		{
			if(i==a1&&j==b1) continue;
			if(i==a2&&j==b2) continue;
			add(i,j);
		}
	}
	for(int i=0;i<pi-2;i++)  //遍历所有组合
	{
		for(int j=i+1;j<pi-1;j++)
		{
			for(int k=j+1;k<pi;k++)
			{
				if( _2(p[i],p[j],p[k]) && _3(p[i],p[j],p[k]) )   //同花顺 
				{
					sum[1]++;continue;
				}
				if(_2(p[i],p[j],p[k]))
				{
					sum[2]++;continue;       //顺子 
				}
				if(_3(p[i],p[j],p[k]))
				{
					sum[3]++;continue;       //同花 
				}
				if(!_456789(p[i],p[j],p[k]))
				{
					sum[9]++;continue; //要不起
				}
			}
		}
	}
	cout<<sum[1];
	for(int i=2;i<=9;i++)
	{
		cout<<" "<<sum[i];
	}
	return 0; 
} 

小结
代码思路不难,但是细节比较多,因为数据不大,对复杂度要求没那么高,还比较好写。
就是要判断的东西太多,一开始不太敢下手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

掌握魔法の东东 II Gym-270437 的相关文章

  • Week6限时大模拟 A - 掌握魔法の东东 II [Gym - 270437J]

    原题链接 https vjudge net problem Gym 270437J origin 题意 基本思路 本题数据规模不大 xff0c A B 100 A B 100
  • A - 掌握魔法の东东 II(Week6模拟考试)

    题目 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和
  • Gym - 102470C Lights

    Statement G i v e n v
  • [GYM 101755]Restoring Numbers

    题面描述 已知两个正整数a b的和s与最大公约数g xff0c 求a b 输入格式 一共一行 xff0c 包含两个正整数 s g 输出格式 一共一行 xff0c 若有解输出 a b 否则输出 1 样例数据 样例输入 6 2 样例输出 4 2
  • A-掌握魔法の东东 II

    A 掌握魔法 东东 II 一 题目描述 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间
  • Week 6 H (A - 氪金带东)(B - 戴好口罩!)(C - 掌握魔法の东东 I)(D - 数据中心)

    Week 6 A 氪金带东题意思路代码 B 戴好口罩 xff01 题意思路代码 C 掌握魔法 东东 I题意思路代码 D 数据中心题意思路代码 A 氪金带东 题意 思路 首先 xff0c 这个图是棵树 解法 xff1a 三遍DFS 前两遍用来
  • week6限时大模拟A - 掌握魔法の东东 II Gym - 101510B

    week6限时大模拟A 掌握魔法 东东 II Gym 101510B A 掌握魔法 东东 II Gym 101510B题目描述输入输出格式及样例思路实验代码 A 掌握魔法 东东 II Gym 101510B 题目描述 从瑞神家打牌回来后 x
  • Isaac Gym(一)在Ubuntu20.04.1中安装Isaac Gym

    在Ubuntu20 04 1中安装Isaac Gym 前提1 安装 Conda1 1 下载Anaconda3安装文件1 2 运行1 3 设置路径 2 安装 Isaac Gym2 1 下载Isaac Gym安装文件2 2 解压并删除安装包2
  • Gym render_modes = env_creator.metadata[“render_modes“]KeyError: ‘render_modes‘ 解决方案

    问题描述 今天在运行一行代码时 xff1a FLAGS env是我自己定义的环境 env 61 gym make FLAGS env 出现了这种错误 xff1a env 61 gym make FLAGS env File 34 lib p
  • gym ValueError: too many values to unpack (expected 4) 解决方案

    问题描述 今天在执行以下代码时出现了题述错误 xff1a new obs rew done info 61 self env step action new obs rew done info 61 self env step action
  • Week2 实验 A - 化学 Gym - 270437A

    题目 甄别烷烃基的类别 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 输入第一行为数
  • Gym 101028J 100541D

    Gym 100499I 这题当理解题意的时候就出现一个难题 xff0c 循环小数怎么转化为分数 xff0c 果断百度下 普及知识 xff1a 1 纯循环小数 小数点后有几位数 分母就有几个9 分子为一个循环节 如 0 345 345循环 6
  • 2016 Team Training #21 Gym 100952 A D E F J

    A 水题 题意 xff1a 两个人的时间分别是时 xff0c 分 xff0c 秒输入 xff0c 也就是让我们输出谁时间最早呗 思路 xff1a 没有思路直接上 xff0c 看手速了 xff08 我敲代码速度慢 xff09 代码如下 xff
  • 掌握魔法の东东 II Gym-270437

    题目 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和
  • A - 掌握魔法の东东 II(暴力求解,害!)

    A 掌握魔法 东东 II 题意 xff1a 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围
  • 【gym】env.render三种mode

    最近使用gym提供的小游戏做强化学习DQN算法的研究 xff0c 首先就是要获取游戏截图 xff0c 并且对截图做一些预处理 screen 61 env render mode 61 39 rgb array 39 上述代码是将游戏截图转换
  • ubuntu20.04安装 gym-gazebo

    官网流程安装 xff1a https github com erlerobot gym gazebo 一 环境与依赖 1 基本环境 xff1a ROS NoeticGazebo11 11 0 2 ROS相关依赖 xff1a sudo apt
  • 关于OpenAI的Gym中的step方法

    文章目录 导读 Gym的step方法 最后的话 导读 本文就只是关于step方法的参数与返回值的一个小小的学习笔记 这也是没有第一时间查官方文档而造成的时间消耗 所以 这篇博客就是逼自己查一下 Gym的step方法 既然都已经用pip下载了
  • 强化学习实践二 :理解gym的建模思想

    David Silver的强化学习公开课有几个特点 个人感觉首要的一个特点是偏重于讲解理论 而且有时候为了讲清楚一个理论的来龙去脉 也顺带讲了很多不常用的理论 还有一个特点是小例子很多 这些例子有时候不仅是为了讲清楚一个复杂的算法 而且通过
  • gym 101512 BAPC 2014 I Interesting Integers

    Problem codeforces com gym 101512 attachments vjudge net contest 186506 problem I Meaning 给出一个 正整数 n 要找尽量小的 a 和 b a lt b

随机推荐

  • 字符串排序-C语言

    二 字符串排序 题目描述 输入一个长度不超过20的字符串 xff0c 对所输入的字符串 xff0c 按照ASCII码的大小从小到大进行排序 xff0c 请输出排序后的结果 输入描述 一个字符串 xff0c 其长度n lt 61 20 输出描
  • Unable to locate package sysv-rc-conf

    报错如下 xff1a 解决办法 xff0c 如下 xff1a 第一步 xff1a 在root权限下操作 xff0c 软件源列表sources list xff08 该文本的位置在vim etc apt sources list xff09
  • Gson使用方法

    一 概述 Gson是google提供的用来操作json数据的一个非常好用的类库 其使用范围非常的广泛 xff0c 所以非常有必要对其进行系统的学习 json是一种数据格式 xff0c 确切的说是一种文本数据格式 其在网络通讯过程中的作用非常
  • Centos7 安装jdk8

    使用rpm方式安装 1 jdk下载地址 xff1a https www oracle com java technologies downloads java8 2 安装 检测当前系统是否存在java环境 xff01 java versio
  • Nginx的https配置

    Nginx的https配置 参考地址 xff08 阿里云提交的教程链接 xff09 xff1a https help aliyun com document detail 212905 html spm 61 5176 b657008 he
  • Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException:

    Failed to parse multipart servlet request nested exception is java lang IllegalStateException The multi part request con
  • php7 mongodb 使用(二)原生驱动 增删改查和统计

    php7安装mongodb的扩展 宝塔面板环境下php7 3默认安装了pecl扩展包 xff0c 安装的php7 4版本是默认不带pecl扩展包的 需要手动安装 php版本 lt 7的时候 yum install php pear 就可以
  • 图论——spfa算法判断负权回路

    在最短路径模板 spfa算法中的模板只适用于不存在负权回路的图 xff0c 否则就会死循环 接下来做一下改动 xff0c 实现通过spfa算法判断是否存在负环 求负环的常用方法 xff0c 基于SPFA xff1a 统计每个点入队的次数 x
  • Python中的pip怎么配置环境变量

    https blog csdn net hanhanwanghaha宝藏女孩 欢迎您的关注 xff01 欢迎关注微信公众号 xff1a 宝藏女孩的成长日记 如有转载 xff0c 请注明出处 xff08 如不注明 xff0c 盗者必究 xff
  • 【Linux Posix】(19)网络编程II - 网络编程基础;网络编程主要函数

    目录 1 字节序列转换 1 1 字节序列转换概述 1 2 字节序列转换的函数 1 3 地址格式转换 2 网络编程基础 2 1 socket概述 2 2 套接字的三种类型 1 字节序列转换 1 1 字节序列转换概述 实验结论 xff1a 这台
  • Debian squid配置

    Basic squid conf etc squid3 squid conf instead of the super bloated default config file auth param basic program usr lib
  • Linux安装mysql以及遇到的问题解决办法

    话不多说 xff0c 直接开干 xff1a 1 mysql下载地址 xff08 这里使用的是5 7 28 xff09 官网地址 xff1a https dev mysql com downloads mysql 百度云地址 xff1a ht
  • kali-linux的搭建

    vmware kali的搭建 使用vmware搭建kali需要有kali的官方镜像 xff0c 这里给出镜像的下载地址 https mirrors tuna tsinghua edu cn kali images kali 2022 3 k
  • C++学习(一三零)规范路径canonical paths

    每个文件都只有一个规范路径 xff0c 可以有多个绝对路径和相对路径 绝对路径与系统相关 如果路径中别名 快捷方式 符号链接等内容 xff0c 规范路径都会将他们解析到实际的文件路径下
  • 树莓派4B外接电视机没反应的问题的解决

    解决办法 xff0c 修改文件 boot config txt
  • 宇宙射线 c++ || DFS

    题目 一个射线 xff0c 初始方向向上 一段时间后会分裂 xff0c 向该方向的左右45度分裂2条射线 宇宙射线会分裂那次 xff0c 每次会前进ai个单位长度 输入描述 第一行一个正整数 n n lt 61 30 表示分裂n次 第二行包
  • DDL 的恐惧 || 贪心

    题目 ZJM 有 n 个作业 xff0c 每个作业都有自己的 DDL xff0c 如果 ZJM 没有在 DDL 前做完这个作业 xff0c 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安排做作业的顺序 xff0c 才能尽可能
  • TT's Magic Cat -- 差分

    题意 TT 有一只猫 xff0c 它从 世界地图 选了 n 个城市 xff0c 用 ai 表示每个城市的资产 猫会给出几个操作 xff0c 区间 l r 的城市资产都加 c 在q次操作后 xff0c 输出所有城市的资产 Input 第一行有
  • 平衡字符串 c++ || 尺取法

    题目 一个长度为 n 的字符串 s xff0c 其中仅包含 Q W E R 四种字符 如果四种字符在字符串中出现次数均为 n 4 xff0c 则其为一个平衡字符串 现可以将 s 中连续的一段子串替换成相同长度的只包含那四个字符的任意字符串
  • 掌握魔法の东东 II Gym-270437

    题目 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和