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

华为OD机考算法题:数字加减游戏

目录

题目部分

解读与分析

代码实现


题目部分

题目数字加减游戏
难度
题目说明小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 s 变成数字 t 。
每个回合,小明可以用当前的数字加上或减去一个数字。
现在有两种数字可以用来加减,分别为 a, b (a≠b),其中 b 没有使用次数限制。
请问小明最少可以用多少次 a,才能将数字 s 变成数字 t 。
题目保证数字 s 一定能变成数字 t。
输入描述输入的唯一一行包含四个正整数s,t,a,b(1≤s,t,a,b≤10^{5}),并且a≠b。
输出描述输出的唯一一行包含一个整数,表示最少需要使用多少次 a 才能将数字 s 变成数字 t。
补充说明
------------------------------------------------------
示例
示例1
输入1 10 5 2
输出1
说明初始值 1 加一次 a 变成 6,然后加两次 b 变成 10,因此 a 的使用次数为 1。
示例2
输入11 33 4 10
输出2
说明11 减两次 a 变成 3,然后加三次 b 变成 33,因此 a 的使用次数为 2 次。


解读与分析

题目解读

由于 a 加一次后再减一次等于 0,在这里需要计算最少次数,所以我们不必做既加又减的操作。同时,也假设 b 也只做一种操作,也不存在既加又减的情况。

在这个前提下,此题要求在 s 的基础上,加减若干次 a,再加减若干次 b,最后得到 t。

本质上,由 s 变成 t ,与 由 t 变成 s相比,加减 a 、b 的次数是一样的,无非就是逆向操作,加变减,减变加。

更进一步思考,s 变成 t,与 ( s + 1) 变成 ( t  + 1 ) 也是一样的,其实就是发生 | s - t | 差值的变化。 

分析与思路

由于 s、t 是固定值,我们假设 n = | s - t |。

此题可以转变为:一个原始数据,加或减a 若干次(假设为 x),加或减 b 若干次(假设为 y),产生的变化为 n 。
此题有 3 种情况:
1.
a * x - b * y = n
2. b * y - a * x = n
3. a * x + b * y = n
其中,x、y 均为正整数。
这 3 个等式可以做如下转换。
1.  
a * x - b * y = n   \Rightarrow  y = \frac{ a * x - n }{ b} 
2.  
b * y - a * x = n  \Rightarrow  y = \frac{ a * x + n }{ b}
3.  a * x + b * y = n \Rightarrow  y = \frac{ n - a * x }{ b}
其中, 第 1 个 和 第 3 个 可以合并成 y = \frac{ | ax - n | }{ b }

在 y = \frac{ a * x + n }{ b}  y = \frac{ | ax - n | }{ b } 这两个等式中,它们的分母都能被 b 整除,这意味着这两个等式可以转换成:
1. 
( a * x ) % b  = n % b
2.  ( a * x ) % b = ( b - n % b) % b
这两个等式的右边都是常数。此题进一步简化:找出最小的 x,使其满足以上 2 个条件中的任意一个。

x 的取值范围是多少呢?由于等式对 b 进行取模操作,即意味着当 x == 0 等同于 x == b, x == 1 也等同于 x == ( b + 1)。直观地看, x 的取值范围为 0 ≤ x < b。

更进一步,假设 a、b 的最小公倍数是 L,那么 a 加 \frac{L}{a} 次与 b 加 \frac{L}{b} 次是相等的,因此 x 的取值范围可以进一步缩小到 0 ≤ x < \frac{L}{a}

那么,此题就可以简化成,把 x 从 0 到 \frac{L}{a} ,代入到等式
1. 
( a * x ) % b  = n % b
2.  ( a * x ) % b = ( b - n % b) % b
中,当这两个等式中任意一个成立时,x 的值即是最小的值。

题目中提到,“题目保证数字 s 一定能变成数字 t”,那我们在遍历时,无需去计算 \frac{L}{a} 的值,必定会在 \frac{L}{a} 之前求出 x 的值。

更进一步,先求 a 与 b 的最大公约数(设为 C1),再求 n 与 b 的最大公约数(C2),接着求 C1 和 C2 的最大公约数(设为 C),那么等式就变成了:
1. 
( \frac{a}{C} * x ) % \frac{b}{C}  = \frac{n}{C} % \frac{b}{C}
2.  ( \frac{a}{C} * x ) % \frac{b}{C} = ( \frac{b}{C} - \frac{n}{C} % \frac{b}{C}) % \frac{b}{C}

此时,\frac{a}{C}  \frac{b}{C} 的最小公倍数变为原来的 \frac{1}{C}x 的范围进一步缩小。

但是,写代码的时候完全不必关心这些。尽管 x 的取值范围进一步缩小,x 的值不会发生改变,从 0 开始遍历,遍历的次数仍旧不会发生改变。

此题空间复杂度为 o(1)。由于输入数字最大不超过10的5次方,运行时间很短。


代码实现

Java代码

import java.util.Scanner;/*** 数字加减游戏* * @since 2023.09.08* @version 0.1* @author Frank**/
public class NumPlusMinusGame {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();String[] numbers = input.split( " " );processNumPlusMinusGame( numbers );}}private static void processNumPlusMinusGame( String numbers[] ){int s = Integer.parseInt( numbers[0] );int t = Integer.parseInt( numbers[1] );int a = Integer.parseInt( numbers[2] );int b = Integer.parseInt( numbers[3] );int n = Math.abs( s - t );// 当modValue1 可能等于 modValue2,如 modValue1 等于0 或 等于 b/2 的情况。int modValue1 = n % b;int modValue2 = ( b - n % b ) % b;int i = 0;while( true ){int tmpModValue = ( a * i ) % b;if( tmpModValue == modValue1 || tmpModValue == modValue2 ){System.out.println(i);return;}i ++;}}
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {var numberArr = line.split(" ");processNumPlusMinusGame(numberArr);}}();function processNumPlusMinusGame(numberArr) {var s = parseInt(numberArr[0]);var t = parseInt(numberArr[1]);var a = parseInt(numberArr[2]);var b = parseInt(numberArr[3]);var n = Math.abs(s - t);// 当modValue1 可能等于 modValue2,如 modValue1 等于0 或 等于 b/2 的情况。var modValue1 = n % b;var modValue2 = (b - n % b) % b;var i = 0;while (true) {var tmpModValue = (a * i) % b;if (tmpModValue == modValue1 || tmpModValue == modValue2) {console.log(i);return;}i++;}}

(完)

相关文章:

华为OD机考算法题:数字加减游戏

目录 题目部分 解读与分析 代码实现 题目部分 题目数字加减游戏难度难题目说明小明在玩一个数字加减游戏&#xff0c;只使用加法或者减法&#xff0c;将一个数字 s 变成数字 t 。 每个回合&#xff0c;小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减…...

WPF命令

在设计良好的Windows应用程序中&#xff0c;应用程序逻辑不应位于事件处理程序中&#xff0c;而应在更高层的方法中编写代码。其中的每个方法都代表单独的应用程序任务。每个任务可能依赖其他库。 使用这种设计最明显的方式是在需要的地方添加事件处理程序&#xff0c;并使用各…...

Unity中Shader的屏幕抓取 GrabPass

文章目录 前言一、抓取1、抓取指令2、在使用抓取的屏幕前&#xff0c;需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的 前言 Unity中Shader的屏幕抓取 GrabPass 一、抓取 1、抓取指令 屏幕的抓取需要使用一个Pass GrabPass{} GrabPass{“NAME”} 2、在使用…...

手撕 队列

队列的基本概念 只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 队列用链表实现 队列的实现 队列的定义 队列…...

【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】-未完成

linux配环境心得&#xff1a;conda/本地配cuda&#xff0c;cudnn及pytorch心得 我们服务器遇到的大多数找不到包的问题一&#xff0c;服务器安装cuda和cudnn使用conda在线安装cuda和cudnn使用conda进行本地安装检查conda安装的cuda和cudnn本地直接安装cuda和cudnn方法一&#x…...

macOS Ventura 13.5.2(22G91)发布,附黑/白苹果镜像下载地址

系统介绍&#xff08;下载请百度搜索&#xff1a;黑果魏叔&#xff09; 黑果魏叔 9 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新&#xff08;内部版本号&#xff1a;22G91&#xff09;&#xff0c;本次更新距离上次发布隔了 21 天。 本次更新查…...

vue 子组件向父组件传递参数 子传父

子组件中写&#xff1a; this.$emit(RowCount,res.data.RowCount); 父组件中写&#xff1a; getMFGLRowCount(val){ //父组件中的方法: 接收子组件传过来的参数值赋值给父组件的变量 //this.totalCount val; alert("这…...

自然语言处理学习笔记(八)———— 准确率

目录 1.准确率定义 2.混淆矩阵与TP/FN/FP/TN 3. 精确率 4.召回率 5.F1值 6.中文分词的P、R、F1计算 7.实现 1.准确率定义 准确率是用来衡量一个系统的准确程度的值&#xff0c;可以理解为一系列评测指标。当预测与答案的数量相等时&#xff0c;准确率指的是系统做出正确判…...

Matlab 如何选择窗函数和 FFT 的长度

Matlab 如何选择窗函数和 FFT 的长度 1、常用的四种窗函数 对于实际信号序列&#xff0c;如何选取窗函数呢&#xff1f;一般来说&#xff0c;选择第一旁瓣衰减大&#xff0c;旁瓣峰值衰减快的窗函数有利于緩解截断过程中产生的頻泄漏问题。但具有这两个特性的窗函数&#xff0…...

node.js下载安装环境配置以及快速使用

目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…...

使用栈检查括号的合法性 C 实现

使用栈检查括号的合法性 思路讲解&#xff1a;首先从数组数组0下标开始&#xff0c;如果是左括号直接无脑压入栈&#xff0c;直到出现右括号开始判断合法与否。遇到右括号分两种情况&#xff0c;第一种是空栈的情况&#xff0c;也就是说我们第一个字符就是右括号&#xff0c;那…...

小白备战大厂算法笔试(四)——哈希表

文章目录 哈希表常用操作简单实现冲突与扩容链式地址开放寻址线性探测多次哈希 哈希表 哈希表&#xff0c;又称散列表&#xff0c;其通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具体而言&#xff0c;我们向哈希表输入一个键 key &#xff0c;则可以…...

云原生Kubernetes:pod基础

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略&#xff08;image PullPolicy&#xff09; 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是ku…...

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

本文是 3 篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构、热…...

CSP-J初赛复习大题整理笔记

本篇全是整理&#xff0c;为比赛准备. 在这里插入代码片 #include<cstdio> using namespace std; int n, m; int a[100], b[100];int main() {scanf_s("%d%d", &n, &m);for (int i 1; i < n; i)a[i] b[i] 0;//将两个数组清0&#xff0c;这…...

面试题 ⑤

1、TCP与UDP的区别 UDPTCP是否连接无连接&#xff0c;即刻传输面向连接&#xff0c;三次握手是否可靠不可靠传输&#xff0c;网络波动拥堵也不会减缓传输可靠传输&#xff0c;使用流量控制和拥塞控制连接对象个数支持一对一&#xff0c;一对多&#xff0c;多对一和多对多交互通…...

硅谷课堂1

文章目录 P1 项目概述P2—P12 MybatisPlus知识回顾P8 MybatisPlus实现逻辑删除P9 QueryWrapper使用P14 项目后端模块介绍P15 项目后端环境搭建P50—P53 整合腾讯云对象存储1、整合腾讯2、腾讯云示例3、讲师头像上传-后端代码P54—P60 课堂分类管理1、课堂分类查询2、课程分类导…...

第6节-PhotoShop基础课程-认识选区

文章目录 前言1.认识选区1.选区原理1.普通选区2.高级选区 2.功能用途1.抠图2.修图3.调色 3.关键操作&#xff08;手术与屠宰的区别&#xff09;2.加选&#xff08;shift 是快捷键&#xff09;3.减选&#xff08;Alt是快捷键&#xff09;4.交集&#xff08;2&#xff0c;3合起来…...

SQLServer如何获取客户端IP

SQLServer如何获取客户端IP 很多用户询问如何通过SQLServer获取客户端IP从而定位一些问题&#xff0c;比如链接泄露&#xff0c;其实主要是利用几个相关视图&#xff0c;如下给出一些SQL方便用户排查 当前链接 SELECT CONNECTIONPROPERTY(PROTOCOL_TYPE) AS PROTOCOL_TYPE,CO…...

爬虫数据清洗可视化实战-就业形势分析

基于采集和分析招聘网站的数据的芜湖就业形势的调查研究 一、引言 本报告旨在分析基于大数据的当地就业形势&#xff0c;并提供有关薪资、工作地点、经验要求、学历要求、公司行业、公司福利以及公司类型及规模的详细信息。该分析是通过网络爬虫技术对招聘网站的数据进行采集…...

Python - 队列【queue】task_done()和join()基本使用

一. 前言 task_done()是Python中queue模块提供的方法&#xff0c;用于通知队列管理器&#xff0c;已经处理完了队列中的一个项目。 queue.task_done()是Queue对象的一个方法&#xff0c;它用于通知Queue对象&#xff0c;队列中的某一项已经被处理完毕。通常在使用Queue对象时…...

springboot web 增加不存在的url返回200状态码 vue 打包设置

spring boot项目增加 html web页面访问 1. 首先 application.properties 文件中增加配置&#xff0c;指定静态资源目录&#xff08;包括html的存放&#xff09; spring.resources.static-locationsclasspath:/webapp/,classpath:/webapp/static/ 2. 项目目录 3. 如果有实现 …...

JavaWeb_LeadNews_Day11-KafkaStream实现实时计算文章分数

JavaWeb_LeadNews_Day11-KafkaStream实现实时计算文章分数 KafkaStream概述案例-统计单词个数SpringBoot集成 实时计算文章分值来源Gitee KafkaStream 概述 Kafka Stream: 提供了对存储与Kafka内的数据进行流式处理和分析的功能特点: Kafka Stream提供了一个非常简单而轻量的…...

python tcp server client示例代码

功能&#xff1a; 实现基本的tcp server端、client端&#xff0c;并引入threading, 保证两端任意链接、断链接&#xff0c;保证两端的稳定运行 IP说明&#xff1a; server不输入IP&#xff0c;默认为本机的IP&#xff0c;client需要输入要链接的server端的IP 端口说明&#x…...

typecho 反序列化漏洞复现

环境搭建 下载typecho14.10.10 https://github.com/typecho/typecho/tags 安装&#xff0c;这里需要安装数据库 PHPINFO POC.php <?php class Typecho_Feed { const RSS1 RSS 1.0; const RSS2 RSS 2.0; const ATOM1 ATOM 1.0; const DATE_RFC822 r; const DATE_W3…...

Python实现SSA智能麻雀搜索算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…...

Java多线程4种拒绝策略

文章目录 一、简介二、AbortPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 三、CallerRunsPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 四、DiscardPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 五、DiscardOldes…...

MySQL的MHA

1&#xff0e;什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过…...

Java实现链表

在Java中&#xff0c;可以使用类来定义链表的节点&#xff0c;并使用引用数据类型&#xff08;即类名&#xff09;来模拟指针进而构建链表。下面是一个简单的示例。 首先&#xff0c;创建一个节点类 Node&#xff0c;它包含一个值和指向下一个节点的引用&#xff1a; public …...

SpringCloud Alibaba(2021.0.1版本)微服务-OpenFeign以及相关组件使用(保姆级教程)

&#x1f4bb;目录 前言一、简绍二、代码实现1、搭建服务模块1.1、建立父包1.2、建立两个子包&#xff08;service-order、service-product&#xff09;1.3、添加util 工具类 2、添加maven依赖和yml配置文件2.1、springcloud-test父包配置2.2、服务模块配置2.2.1、service-orde…...