【华为OD题库-094】最佳的出牌方法-java

题目

手上有一副扑克牌,每张牌按牌面数字记分(J=11,Q=12,K=13,没有大小王),出牌时按照以下规则记分:
出单张,记牌面分数,例如出一张2,得分为2
出对或3张,记牌面分数总和再x2,例如出3张3,得分为(3+3+3)x2=18
出5张顺,记牌面分数总和再x2,例如出34567顺,得分为(3+4+5+6+7)×2=50
出4张炸弹,记牌面分数总和再x3,例如出4张4,得分为4x4x3=48
求出—副牌最高的得分数。
输入描述
按顺序排好的一副牌,最少1张,最多15张。
1-9输入为数字1-9,10输入为数字0,JQK输入为大写字母JQK.
无需考虑输入非法的情况,例如输入字符不在[0-9JQK]范围或某—张牌超过4张
输出描述
最高的得分数
备注
积分规则中没有的出牌方式不支持,例如不支持3带1、4带2,不支持5张以上的顺,且10JQKA(OJQK1)不算顺.
示例1:
输入:
33445677
输出
67
说明
出对3、对4、对7,单张5、6,得分为67;
出34567顺,再出单张3、4、7,得分为64
输出结果67
因此最高得分是按对出,可得到最高分67,

思路

这道题比较难,我这边思考了很久,解法如下:

使用int[] freq存放每种牌存放的数量,freq[0]代表A(1)出现的数量,freq[i]代表i+1出现的数量
当freq[i]==1时,单张出得分:x,顺子出:2x,可以多得x分(x即牌面值,此处等于i+1)
当freq[i]==2时,一对出得分:2*2*x=4x,顺子出:x+2*x,少了x分
当freq[i]==3时,三张出得分:2*3*x=6x,顺子出:2*2*x+2*x=6x,不多不少
当freq[i]==4时,四张出得分:4*x*3=12x,顺子出:2*3*x+2*x=8x,少了4x
根据题意,在不考虑顺子的情况,有几张出几张的出法得分肯定最高,此时计算出一个初始的res。
接着,在考虑顺子的情况下,每计算一个顺子,按上述讨论,得出增益量。
假设最后得到的最大增益量为正数,那么res结果加上它即可(说明拆成顺子出可以使得分更高)
以数据3445566778为例,不考虑顺子时,得分:res=3+4*2*2+5*2*2+6*2*2+7*2*2+8=99
抽出3,4,5,6,7作为顺子的增益量:+3-4-5-6-7=-19
抽出4,5,6,7,8作为顺子的增益量:-4-5-6-7+8=-14
抽2个顺子(34567,45678)的增益量:第一个增益量为-19,在第一个的基础上再抽第二个(此时freq的数据发生了变更),-19+4+5+6+7+8=11
所以最后结果为99+11=110(网上很多解法此用例无法通过,很多没考虑同时拆两个顺子的情况,第一个顺子虽然是负增益,但是第二个顺子会是正增益,两者抵消后结果可能就是正增益
到这里,问题转化为:对于给定牌,考虑拆成顺子的所有可能,能够得到一个最大增量量?回溯法即可

题解

package hwod;import java.util.*;public class BestPoker {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String input = sc.nextLine();int len = input.length();int[] nums = new int[len];final char[] chars = input.toCharArray();for (int i = 0; i < len; i++) {if (chars[i] == '0') nums[i] = 10;else if (chars[i] == 'J') nums[i] = 11;else if (chars[i] == 'Q') nums[i] = 12;else if (chars[i] == 'K') nums[i] = 13;else nums[i] = chars[i] - '0';}System.out.println(bestPoker(nums));}private static int szAdd = 0;//最大的顺子增益private static int[] freq = new int[13];private static int bestPoker(int[] nums) {for (int i = 0; i < nums.length; i++) {freq[nums[i] - 1]++;}int res = 0;//不考虑顺子能得多少分for (int i = 0; i < freq.length; i++) {if (freq[i] == 0 || freq[i] > 4) {continue;}if (freq[i] == 1) {res += i + 1;} else if (freq[i] == 2) {res += 2 * (i + 1) * 2;} else if (freq[i] == 3) {res += 3 * (i + 1) * 2;} else if (freq[i] == 4) {res += 4 * (i + 1) * 3;}}dfs(0, 0);//如果拆成顺子后,得分能够增加if (szAdd > 0) res += szAdd;return res;}/**** @param idx freq中的索引位置* @param score 顺子的得分增益*/private static void dfs(int idx, int score) {szAdd = Math.max(szAdd, score);for (int i = idx; i < 9; i++) {//要组成顺子,起始值不能超过9,所以索引小于等于8if (!checkedSZ(i)) continue;int lstScore = score;//回溯时,恢复上次计算的scorefor (int k = 0; k < 5; k++) {if (freq[i + k] == 1) score += i + k + 1;else if (freq[i + k] == 2) score -= i + k + 1;else if (freq[i + k] == 4) score -= 4 * (i + k + 1);freq[i + k]--;}dfs(i, score);for (int k = 0; k < 5; k++) {freq[i + k]++;score = lstScore;}}}/**** @param idx* @return 判断给定idx开始,能否组成顺子*/private static boolean checkedSZ(int idx) {for (int i = 0; i < 5; i++) {if (freq[idx + i] == 0) {return false;}}return true;}}

解法二:也可以不分析那么多,直接回溯列出所有可能的出法,最后得到最高得分,参考的伏城之外的博客

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

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

相关文章

根据excel中的数据信息批量修改图片名称

背景说明 接了一个需求&#xff0c;需要将批量图片按照指定的需求进行重命名&#xff0c;本来的图片是以身份证号进行命名的.jpg文件&#xff0c;现在需要统一命名为班级姓名身份证号.png格式的文件。其中&#xff0c;用户提供了一张导出的excel数据表(data.xlsx)&#xff0c;数…

Salesforce回归后:谁在成为中国市场上的CRM首选?

怎样的C RM才是在中国这片土地上的最佳答案&#xff1f; 在Salesforce重新回归的今天&#xff0c;其所面临的产品、生态、技术、服务、数据等问题也恰是中国本土的CRM厂商被多年磨练和审视的问题。 在如Salesforce等国外软件进军中国市场的同时&#xff0c;中国本土的CRM厂商…

《漫画算法》笔记——给定数,求删除k个数字后的最小值

/*** 题目&#xff1a;给定一个数&#xff0c;求 删除k个数字后的最小值* 思路&#xff1a;考虑 “如何删除一个数字&#xff0c;得到最小值”&#xff0c;* 不难想到&#xff0c;应该优先删除“靠前&#xff0c;值大”的数字&#xff0c;* 观察到&#xff1a;如果一个数字大于…

深度学习14—注意力机制与自注意力机制

注&#xff1a;以下均为个人学习笔记&#xff0c;发布只为方便学习阅读&#xff0c;若觉侵权&#xff0c;请联系删除&#xff01;&#xff01; 1.李沐老师课堂学习理解笔记 1.1 随意线索和不随意线索 1.2 注意力机制 通过注意力池化层来有偏向性的选择某些输入。 1.3 注意力…

Linux 音视频SDK开发实践

一、兼容性适配处理 为什么需要兼容处理&#xff1f; 1、c兼容处理 主要有ABI兼容性问题&#xff0c;不同ubuntu系统依赖的ABI版本如下&#xff1a; ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXG…

BearPi Std 板从入门到放弃 - 后天篇(3)(ESP8266透传点灯)

简介 电脑搭建一个TCP Server&#xff0c; ESP8266 串口设置好透传模式, 再由TCP Server发送指令控制灯的亮灭; 开灯指令&#xff1a; led_on回车 &#xff1b; 关灯指令: led_off回车 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 / LPUART E…

指针---你真的会使用指针吗?

指针作为C语言中的一个部分&#xff0c;可以说指针是C语言的核心&#xff0c;那么它的难度肯定是不言而喻的&#xff0c;总是能把人给绕得找不到方向。 今天我就好好的说一说指针这个东西。 1、何为指针&#xff1f; 指针是C语言中用来存放地址的一个变量类型。我们可以将指针看…

Uniapp + Vue3 + Pinia + Vant3 框架搭建

现在越来越多项目都偏向于Vue3开发&#xff0c;想着uniapp搭配Vue3试试效果怎么样&#xff0c;接下来就是详细操作步骤。 初始化Uniapp Vue3项目 App.vue setup语法 <script setup>import {onLaunch,onShow,onHide} from dcloudio/uni-apponLaunch(() > {console.l…

同源策略:保护你的网页免受恶意攻击的第一道防线(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

使用Flask逐步搭建Web应用程序

大家好&#xff0c;Flask是一个使用Python编写的轻量级Web应用框架。它被设计成简单、易于学习和使用的&#xff0c;同时具备足够的灵活性和扩展性&#xff0c;以满足各种规模的Web应用开发需求。本文我们将介绍一个使用Flask逐步搭建Web应用程序的简单入门示例。 1.安装Flask…

计算机存储术语: 扇区,磁盘块,页

扇区(sector) 硬盘的读写以扇区为基本单位。磁盘上的每个磁道被等分为若干个弧段&#xff0c;这些弧段称之为扇区。硬盘的物理读写以扇区为基本单位。通常情况下每个扇区的大小是 512 字节。linux 下可以使用 fdisk -l 了解扇区大小&#xff1a; $ sudo /sbin/fdisk -l Disk …

Vue3-24-组件-异步组件的介绍

什么是异步组件 个人理解 &#xff1a;异步组件 就是在用到这个组件的时候再进行加载&#xff0c;而不是 一上来就全部加载完成。即用即取的一个思想。异步组件中使用到的方法 &#xff1a; defineAsyncComponent () 方法 &#xff1a; 返回一个Promise 对象; 我们在开发过程中…

真实并发编程问题-1.钉钉面试题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

Unity中Shader缩放矩阵

文章目录 前言一、直接相乘缩放1、在属性面板定义一个四维变量&#xff0c;用xyz分别控制在xyz轴上的缩放2、在常量缓存区申明该变量3、在顶点着色器对其进行相乘&#xff0c;来缩放变换4、我们来看看效果 二、使用矩阵乘法代替直接相乘缩放的原理1、我们按如下格式得到缩放矩阵…

C#基础——文件、文件夹操作和序列化存储

文件操作、文件夹操作和序列化存储 1、文件操作 如果要对文件进行操作&#xff0c;首先需要先引入IO命名空间 using System.IO;File 类位于 System.IO 命名空间中&#xff0c;用于执行文件级别的操作。它提供了一组静态方法&#xff0c;用于创建、复制、删除、移动和读取文件…

漫谈UNIX、Linux、UNIX-Like

漫谈UNIX、Linux、UNIX-Like 使用了这么多年Redhat、Ubuntu等Linux、Windows、Solaris操作系统&#xff0c;你是否对UNIX、Unix-Like&#xff08;类UNIX&#xff09;还是不太清楚&#xff1f;我以前一直认为Unix-Like就等于Linux。其实&#xff0c;由UNIX派生出来而没有取得UN…

java实现回文数算法

判断一个数是否为回文数可以使用以下算法&#xff1a; 将数字转化为字符串&#xff1b;初始化左右两个指针&#xff0c;分别指向字符串的首尾&#xff1b;循环比较左右指针指向的字符&#xff0c;如果相等则继续比较&#xff0c;直到左右指针相遇或者发现不相等的字符为止&…

ES集群G1回收器,堆空间无法被回收问题

ES堆空间不足的问题&#xff0c;困扰了我有两年的时间。dump堆去分析&#xff0c;也未能分析出来&#xff0c;堆到底是被什么占用了。 我把堆空间给了31.9G&#xff0c;这是指针压缩生效的临界值&#xff0c;如果再大就指针压缩失效了。 痛苦的是&#xff0c;随着时间的增长。堆…

mysql复习笔记05(小滴课堂)

mysql的慢查询日志开启与问题定位 一张数据库数据很大的表。 查询一条数据&#xff0c;很快就查询出来了。 根据不同的条件&#xff0c;查到的数据相同&#xff0c;但是查询所花费的时间却是不同的。 使用命令查询慢查询日志是否开启&#xff0c;目前它是关闭着的。 开启日志。…

利用prometheus+grafana进行Linux主机监控

文章目录 一.架构说明与资源准备二.部署prometheus1.上传软件包2.解压软件包并移动到指定位置3.修改配置文件4.编写启动脚本5.启动prometheus服务 三.部署node-exporter1.上传和解压软件包2.设置systemctl启动3.启动服务 四.部署grafana1.安装和启动grafana2.设置prometheus数据…