2021牛客OI赛前集训营-提高组(第三场) T4扑克

news2024/11/17 15:30:18

2021牛客OI赛前集训营-提高组(第三场)

题目大意

小A和小B在玩扑克牌游戏,规则如下:

从一副52张牌(没有大小王)的扑克牌中随机发3张到每个玩家手上,每个玩家可以任意想象另外两张牌,与自己手上的牌组成5张牌,已构成最大的手牌。

两幅手牌比较大小的规则如下:

在这里插入图片描述
如果牌型一致,则按关键牌组来比较。

小A可以知道小B手中的牌。小A决定对于每一次游戏都想象出一副刚刚好能赢小B的牌。请你告诉小A这两张牌分别是什么,或告诉他无法取胜。


题解

注意事项

  • 玩家可以想象对方有的牌,但不能想象自己有的牌
  • 小A的牌要在能赢小B的基础上尽量小,如果有两种花色都能赢小B,则优先选择花色小的

一些简化

  • 因为无论三张牌如何,都至少可以通过想象得到三条,所以两对,一对和高牌可以不用考虑

做法

在不考虑花色的情况下,暴力枚举出所有五元组,五元组的数量并不多。然后将五元组排序,再求出所有三元组。

对于每次询问,将三元组对应的五元组进行比较,再考虑花色的影响,即可得出答案。

code

#include<bits/stdc++.h>
using namespace std;
int t,c1,vd,mxa,mxb,va,vb,sc,fl,ip[205],icl[205],z[20],zh[20],zp[10][20];
int tot=0,d[500005],l[500005],r[500005];
char op[20],ocl[10];
void add(int xx,int yy){
	l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;
}
struct node{
	int x,y;
}a[10],b[10];
struct five{
	int val,sh,a[10];
}w,ans,v[50005];
void init(){
	for(int i=2;i<=9;i++){
		ip[i+'0']=i;op[i]=i+'0';
	}
	ip['T']=10;ip['J']=11;ip['Q']=12;ip['K']=13;ip['A']=14;
	op[10]='T';op[11]='J';op[12]='Q';op[13]='K';op[14]='A';
	icl['S']=4;icl['H']=3;icl['C']=2;icl['D']=1;
	ocl[4]='S';ocl[3]='H';ocl[2]='C';ocl[1]='D';
}
void dfs(int t,int now){
	for(int i=now;i<=14;i++){
		if(z[i]<4){
			w.a[t]=i;++z[i];
			if(t<5) dfs(t+1,i);
			else v[++vd]=w;
			--z[i];
		}
	}
}
bool four_of_a_kind(){
	if(w.a[2]==w.a[3]&&w.a[3]==w.a[4]){
		if(w.a[1]==w.a[2]||w.a[4]==w.a[5]) return 1;
	}
	return 0;
}
bool full_house(){
	if(w.a[1]==w.a[2]&&w.a[2]==w.a[3]&&w.a[4]==w.a[5]) return 1;
	if(w.a[1]==w.a[2]&&w.a[3]==w.a[4]&&w.a[4]==w.a[5]) return 1;
	return 0;
}
bool three_of_a_kind(){
	if(w.a[1]==w.a[2]&&w.a[2]==w.a[3]) return 1;
	if(w.a[2]==w.a[3]&&w.a[3]==w.a[4]) return 1;
	if(w.a[3]==w.a[4]&&w.a[4]==w.a[5]) return 1;
	return 0;
}
void gt(){
	if(w.a[1]+1==w.a[2]&&w.a[2]+1==w.a[3]&&w.a[3]+1==w.a[4]&&w.a[4]+1==w.a[5]) w.sh=1;
	if(four_of_a_kind()){
		w.val=7e8+w.a[3]*14;
		if(w.a[1]!=w.a[3]) w.val+=w.a[1];
		else w.val+=w.a[5];
	}
	else if(full_house()){
		if(w.a[3]==w.a[1]) w.val=6e8+w.a[3]*15+w.a[5];
		else w.val=6e8+w.a[3]*15+w.a[1];
	}
	else if(w.sh) w.val=4e8+w.a[1];
	else if(three_of_a_kind()){
		w.val=3e8+w.a[3]*15*15;
		if(w.a[1]==w.a[2]&&w.a[2]==w.a[3]) w.val+=w.a[5]*15+w.a[4];
		else if(w.a[2]==w.a[3]&&w.a[3]==w.a[4]) w.val+=w.a[5]*15+w.a[1];
		else w.val+=w.a[2]*15+w.a[1];
	}
}
int find(int w1,int w2,int w3){
	return w1*15*15+w2*15+w3;
}
int dd(int g1,int g2,int w1,int w2,int w3){
	if(g2<w1){
		swap(g2,w1);
		if(w1<w2){
			swap(w1,w2);
			if(w2<w3) swap(w2,w3);
		}
	}
	if(g1<g2){
		swap(g1,g2);
		if(g2<w1){
			swap(g2,w1);
			if(w1<w2){
				swap(w1,w2);
				if(w2<w3) swap(w2,w3);
			}
		}
	}
	if(w3+1==w2&&w2+1==w1&&w1+1==g2&&g2+1==g1) return 1e8+w3;
	return g1*15*15*15*15+g2*15*15*15+w1*15*15+w2*15+w3;
}
void pt(){
	for(int i=1;i<=4;i++) zh[i]=0;
	for(int i=2;i<=14;i++) z[i]=0;
	++z[a[1].y];++zh[a[1].x];++zp[a[1].x][a[1].y];
	++z[a[2].y];++zh[a[2].x];++zp[a[2].x][a[2].y];
	++z[a[3].y];++zh[a[3].x];++zp[a[3].x][a[3].y];
	for(int i=5;i>=1;i--){
		if(z[ans.a[i]]) --z[ans.a[i]];
		else{
			if(fl) zp[a[1].x][ans.a[i]]=1;
			else{
				for(int j=1;j<=4;j++){
					if(!zp[j][ans.a[i]]&&zh[j]<4){
						++zh[j];
						zp[j][ans.a[i]]=1;
						break;
					}
				}
			}
		}
	}
	for(int i=2;i<=14;i++){
		for(int j=4;j>=1;j--){
			if(zp[j][i]){
				printf("%c%c ",ocl[j],op[i]);
				zp[j][i]=0;
			}
		}
	}
}
int main()
{
	init();
	dfs(1,2);
	for(int i=1;i<=vd;i++){
		w=v[i];gt();
		v[i]=w;
		add(find(w.a[1],w.a[2],w.a[3]),i);
		add(find(w.a[1],w.a[2],w.a[4]),i);
		add(find(w.a[1],w.a[2],w.a[5]),i);
		add(find(w.a[1],w.a[3],w.a[4]),i);
		add(find(w.a[1],w.a[3],w.a[5]),i);
		add(find(w.a[1],w.a[4],w.a[5]),i);
		add(find(w.a[2],w.a[3],w.a[4]),i);
		add(find(w.a[2],w.a[3],w.a[5]),i);
		add(find(w.a[2],w.a[4],w.a[5]),i);
		add(find(w.a[3],w.a[4],w.a[5]),i);
	}
	char ch[5];
	scanf("%d",&t);
	while(t--){
		fl=sc=0;
		for(int i=1;i<=3;i++){
			scanf("%s",ch);
			a[i]=(node){icl[ch[0]],ip[ch[1]]};
		}
		if(a[1].x==a[2].x&&a[2].x==a[3].x) sc=1;
		for(int i=1;i<=3;i++){
			scanf("%s",ch);
			b[i]=(node){icl[ch[0]],ip[ch[1]]};
		}
		mxb=0;vb=0;
		int vt=find(b[1].y,b[2].y,b[3].y);
		for(int i=r[vt];i;i=l[i]){
			mxb=max(mxb,v[d[i]].val);
			vb|=v[d[i]].sh;
		}
		if(b[1].x==b[2].x&&b[2].x==b[3].x){
			int g1=0,g[20];
			for(int i=14;i>=2;i--){
				if(i!=b[1].y&&i!=b[2].y&&i!=b[3].y){
					g[++g1]=i;
					if(g1>=2) break;
				}
			}
			mxb=max(mxb,500000000+dd(g[1],g[2],b[3].y,b[2].y,b[1].y));
			if(vb){
				mxb=9e8+min(10,b[1].y);
				if(b[1].y==10) mxb=1e9;
			}
		}
		mxa=2e9;va=0;
		vt=find(a[1].y,a[2].y,a[3].y);
		for(int i=r[vt];i;i=l[i]){
			if(v[d[i]].val>mxb&&v[d[i]].val<mxa){
				mxa=v[d[i]].val;
				ans=v[d[i]];
			}
			va|=v[d[i]].sh;
		}
		if(a[1].x==a[2].x&&a[2].x==a[3].x){
			int g1=0,g[20];
			for(int i=14;i>=2;i--){
				if(i!=a[1].y&&i!=a[2].y&&i!=a[3].y) g[++g1]=i;
			}
			for(int i=1;i<=g1;i++){
				for(int j=i+1;j<=g1;j++){
					vt=5e8+dd(g[i],g[j],a[3].y,a[2].y,a[1].y);
					if(vt>mxb&&vt<mxa){
						mxa=vt;fl=1;
						ans.a[1]=a[1].y;
						ans.a[2]=a[2].y;
						ans.a[3]=a[3].y;
						ans.a[4]=g[j];
						ans.a[5]=g[i];
					}
				}
			}
			if(va){
				for(int i=min(10,a[1].y);i+4>=max(a[3].y,6);i--){
					vt=9e8+i;
					if(i==10) vt=1e9;
					if(vt>mxb&&vt<mxa){
						mxa=vt;fl=1;
						ans.a[1]=i;
						ans.a[2]=i+1;
						ans.a[3]=i+2;
						ans.a[4]=i+3;
						ans.a[5]=i+4;
	
					}
				}
			}
		}
		if(mxa==2e9) printf("-1");
		else pt();
		printf("\n");
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何知道单个操作命令的拼写

Allegro如何知道单个操作命令的拼写 在用Allegro做PCB设计的时候,时常需要给某些命令设置一些快捷键,但是有时候无法知道命令的拼写是什么,就无法定义到env文件里面去 如下图 如何知道上方图标的命令拼写,下面介绍两种方法 方法一 鼠标左键移动到图标的位置,就会出现命令…

【动态规划】背包问题(01背包,完全背包)

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

JavaWeb学习-Tomcat

常用的Web服务器 ①IIS&#xff1a;Microsoft的Web服务器产品为Internet Information Services &#xff08;IIS&#xff09;&#xff0c;IIS 是允许在公共Intranet或Internet上发布信息的Web服务器。ⅡS是目前最流行的Web服务器产品之一&#xff0c;很多著名的网站都是建立在…

二进制转换之命理学习

什么是十神 运用儒家学说&#xff1a; 克我者官也&#xff1a;古代没有民主思想&#xff0c;官不是为民服务的&#xff0c;官就是克的。 对男命来说克我的是儿女&#xff0c;女儿是正官&#xff0c;儿子是偏官&#xff08;七杀&#xff09;克的厉害&#xff0c;对父亲来说有了…

图解七大排序算法,面试超高频考点,java实现

前言 排序算法在面试中属于超高频的考点了&#xff0c;至少要学会如何手写各种排序算法&#xff0c;其中快速排序尤为重要 看完了本文以后&#xff0c;大家可以自己尝试着去手写一下这些排序算法啦&#xff0c;leetcode题号&#xff1a;75颜色分类 多努力点&#xff0c;活的…

体验用arduino来实现PLC编程器的功能

是不是想自己临时做个PLC的测试&#xff0c;但又不想卖西门子三菱的PLC&#xff0c;那就可以用这个&#xff0c;把arduino变成一个PLC的编程器。 文章目录一、下载与安装1、下载2、安装二、初次使用1、打开范例程序学习2、调试运行3、下载到arduino板中文章出处&#xff1a; ht…

科技成果赋智中小企业深度行 边界无限靖云甲ADR入选十大优秀案例

近日&#xff0c;国家工业信息安全发展研究中心、青岛市工业和信息化局、青岛市民营经济发展局、青岛市即墨区人民政府、青岛蓝谷管理局联合举办的科技成果赋智中小企业“深度行”活动&#xff08;青岛站&#xff09;成功举办&#xff0c;同步举行了赋智“深度行”活动&#xf…

最短路径Dijkstra算法的分析与具体实现(思路加代码)

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; ✨精品专栏&#xff1a;C面向对象 &#x1f525;系列专栏&#xff1a;数据结构与课程设计 文章目录…

Gson序列化Class对象报错解决办法

1. 背景 昨天在写RPC的基础Demo的时候&#xff0c;使用JSON作为序列化方式&#xff0c;然后在序列化对象的时候&#xff0c;报错了。 我复现一下该报错&#xff1a; public class GsonTest {public static void main(String[] args) {new Gson().toJson(String.class);}}具体…

C/C++每日一练(20230309)

目录 1. 罗马数字转整数 ★ 2. 最大数 ★★ 3. 有效数字 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 ​专栏 1. 罗马数字转整数 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&…

达梦关系型数据库

达梦关系型数据库一、DM8 安装1. 安装包下载2. Docker 安装3. Linux 安装4. Windows 安装二、DM 管理工具三、命令行交互工具 DIsql四、DM8 SQL使用1. 创建模式2. 创建表3. 修改表4. 读写数据5. 查看库下所有的表名6. 查看表字段信息GitHub: link. 欢迎star国产自主研发的大型…

数据挖掘(2.2)--数据预处理

目录 二、数据描述 1.描述数据中心趋势 1.1平均值和截断均值 1.2加权平均值 1.3中位数&#xff08;Median&#xff09;和众数(Mode) 2.描述数据的分散程度 2.1箱线图 2.2方差和标准差 2.3正态分布 3.数据清洗 3.1数据缺失的处理 3.2数据清洗 二、数据描述 描述数…

自动化测试实战篇(9),jmeter常用断言方法,一文搞懂9种测试字段与JSON断言

Jmeter常用的断言主要有&#xff0c;JSON断言和响应断言这两种方式。 断言主要就是帮助帮助人工进行快速接口信息验证避免繁杂的重复的人工去验证数据 第一种响应断言Apply to&#xff1a;表示应用范围测试字段&#xff1a;针对响应数据进行不同的匹配响应文本响应代码响应信息…

【Go自学第一节】GoLang 数据类型

和Java类型&#xff0c;go拥有多种数据类型&#xff0c;可以把它分为四个大类基础类型、聚合类型、引用类型和接口类型 一、基本数据类型 基本数据类型又可以细分为&#xff1a;数字类型&#xff08;整型、浮点型&#xff09;、布尔类型、字符串类型 整型 Go 的整型分为有符号…

计算机网络的166个概念你知道几个 第十一部分

计算机网络数据链路层和物理层节点&#xff1a;一般指链路层协议中的设备。链路&#xff1a;一般把沿着通信路径连接相邻节点的通信信道称为链路。MAC 协议&#xff1a;媒体访问控制协议&#xff0c;它规定了帧在链路上传输的规则。奇偶校验位&#xff1a;一种差错检测方式&…

基于gin-vue-admin[gin+gorm]手动实现crud(全)

使用Gin-Vue- Admin框架手动实现crud 在gva框架下自己手动实现一个CRUD的操作&#xff0c;该操作将会结合gen进行探讨学习&#xff0c;具体实现可以看下面代码的实现&#xff0c;项目目录层级分为api层&#xff0c;service层&#xff0c;model层&#xff0c;common层&#xff…

1/4、1/2、整车悬架天棚主动控制仿真分析合集

目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 4.总结 参考文献 前言 对于天棚控制相比大家不陌生&#xff0c;它是由美国的Karnopp提出&#xff0c;利用假设的与天棚固连…

【数据结构】链表相关题目(简单版)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; 初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是…

软件测试10

Linux和数据库 1.Linux命令&#xff1a;软件测试第一个任务&#xff0c;一般都需要进行环境搭建&#xff0c;一部分环境搭建内容是在服务器上实现的&#xff0c;跟服务器交互需要使用Linux命令。&#xff08;因为Linux没有图形化页面&#xff09; 2.数据库&#xff1a;所有的软…

ccf-csp 202112-3登机牌条码

题目背景 西西艾弗岛景色优美&#xff0c;游人如织。但是&#xff0c;由于和外界的交通只能靠渡船&#xff0c;交通的不便严重制约了岛上旅游业的发展。西西艾弗岛管委会经过努力&#xff0c;争取到了一笔投资&#xff0c;建设了一个通用航空机场。在三年紧锣密鼓的主体建设后…