当前位置: 首页 > news >正文

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

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;
}

相关文章:

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

2021牛客OI赛前集训营-提高组&#xff08;第三场&#xff09; 题目大意 小A和小B在玩扑克牌游戏&#xff0c;规则如下&#xff1a; 从一副52张牌&#xff08;没有大小王&#xff09;的扑克牌中随机发3张到每个玩家手上&#xff0c;每个玩家可以任意想象另外两张牌&#xff0…...

【OJ比赛日历】快周末了,不来一场比赛吗? #03.11-03.17 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录2023-03-11&…...

C++-说一说异常机制

C异常机制是一种处理程序错误的高级方法。当程序出现错误时&#xff0c;可以通过抛出异常来通知调用者进行处理&#xff0c;或者在异常对象被捕获之后终止程序执行。 异常处理语法 在C中&#xff0c;可以使用 throw 抛出异常&#xff0c; try-catch 处理异常&#xff0c;try块中…...

k8s CSI插件浅析

Kubernetes CSI (Container Storage Interface)插件是一种可插拔的存储插件&#xff0c;可以将外部存储系统的功能集成到Kubernetes集群中。它允许Kubernetes管理员动态地将外部存储系统映射到容器中&#xff0c;以满足应用程序对持久化存储的需求。 CSI插件基于一组规范定义的…...

九、CSS3新特性三

文章目录一、逐帧动画二、flex弹性盒子三、少量元素侧轴对齐方式四、折行侧轴对齐方式五、项目属性六、网格布局七、网格布局的对齐方式八、网格布局的项目合并一、逐帧动画 一张背景图&#xff0c;改变back-position-x的位置让他动起来 step-start 逐帧动画 animation: play …...

Dynamics365 本地部署整体界面

昨天已经登陆上去了然后今天开机突然又登陆不上去了 具体原因也不知道 然后我把注册插件删除又重新下载结果还是登陆不上去于是返回之前的断点就可以登陆上去了重复昨天的操作这里就不截图了6、注册新步骤右键单击&#xff08;插件&#xff09;BasicPlugin.FollowUpPlugin&…...

Binder ——binder的jni注册和binder驱动

环境&#xff1a;Android 11源码Android 11 内核源码源码阅读器 sublime textbinder的jni方法注册zygote启动1-1、启动zygote进程zygote是由init进程通过解析init.zygote.rc文件而创建的&#xff0c;zygote所对应的可执行程序是app_process&#xff0c;所对应的源文件是app_mai…...

Python+Yolov8目标识别特征检测

Yolov8目标识别特征检测如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<Yolov8目标识别特征检测>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐…...

欢迎使用Markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

Mac环境安装python

一、介绍&#xff1a; Python是跨平台的&#xff0c;它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序&#xff0c;放到Linux上也是能够运行的。 要开始学习Python编程&#xff0c;首先就得把Python安装到你的电脑里。安装后&#xff0c;你会得到Pyt…...

2023年全国最新交安安全员精选真题及答案16

百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、判断题&#xff1a; 1.施工单位应当向作业人员提供安全防护用具和安全防护服…...

项目实战-瑞吉外卖day02(B站)持续更新

瑞吉外卖-Day02课程内容完善登录功能新增员工员工信息分页查询启用/禁用员工账号编辑员工信息1. 完善登录功能1.1 问题分析前面我们已经完成了后台系统的员工登录功能开发&#xff0c;但是目前还存在一个问题&#xff0c;接下来我们来说明一个这个问题&#xff0c; 以及如何处理…...

2018年MathorCup数学建模D题公交移动支付问题的评估方案解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 D题 公交移动支付问题的评估方案 原题再现&#xff1a; 随着智能手机的普及和移动支付技术的提高,越来越多的支付手段可以转移到手机端。现有的现金缴费和实体公交卡刷卡的付费方式存在缺点&#xff0c;如公交卡在使用过程中存在着充…...

js原型和原型链到底是什么

有必要重新审视js原型链 经大量资料查找之后自我理解的总结&#xff1a; 一说原型有太多的总结&#xff0c;把我都给劝退了&#xff0c;太多所谓的名词&#xff1a;constructor | proto | prototype | Object.prototype | Function.prototype | new 从js的底层来理解&#xf…...

RocketMQ5.0.0消息消费<二> _ 消息队列负载均衡机制

目录 一、消费队列负载均衡概览 二、消费队列负载均衡实现 1. 负载均衡UML 2. 启动RebalanceService线程 3. PUSH模式负载均衡 三、负载均衡策略 四、参考资料 一、消费队列负载均衡概览 RocketMQ默认一个主题下有4个消费队列&#xff0c;集群模式下同一消费组内要求每个…...

【数据库】MySQL数据库约束(六大约束)

目录 1.数据库约束 1.1约束类型 1.2 非空约束&#xff08;NOT NULL &#xff09; 1.3 唯一约束&#xff08;UNIQUE&#xff09; 1.4默认值约束&#xff08;DEFAULT &#xff09; 1.5主键约束&#xff08;PRIMARY KEY&#xff09; 1.6外键约束&#xff08;FOREIGN KEY &…...

使用inotify监视文件后台运行收到 SIGTTIN 信号的原因及解决方案

一、起因 由于之前写了个程序要实时监控指定文件的变化状态&#xff0c;所以使用了“inotify”进行监视。但是却发现用了“inotify”之后进程无法手动后台运行了。 也就是 ./process.exe &&#xff0c;这种方法不行了。 原因是&#xff1a; 当使用inotify监视文件变化时&a…...

L3-021 神坛

在古老的迈瑞城&#xff0c;巍然屹立着 n 块神石。长老们商议&#xff0c;选取 3 块神石围成一个神坛。因为神坛的能量强度与它的面积成反比&#xff0c;因此神坛的面积越小越好。特殊地&#xff0c;如果有两块神石坐标相同&#xff0c;或者三块神石共线&#xff0c;神坛的面积…...

ArrayList和LinkedList区别

List<TreeNode> list new ArrayList<TreeNode>(); List<TreeNode> allTrees new LinkedList<TreeNode>(); 这两行代码都是用来创建一个存储多个 TreeNode 对象的列表&#xff0c;但是它们使用的底层实现不同。 ArrayList 是一种数组实现的动态数组&…...

977. 有序数组的平方 1. 两数之和 349. 两个数组的交集

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 …...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...