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

news2025/2/26 6:15:50

目录

题目部分

解读与分析

代码实现


题目部分

题目数字加减游戏
难度
题目说明小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 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++;
    }

}

(完)

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

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

相关文章

华为云云耀云服务器L实例评测|华为云上试用主机安全产品Elkeid

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上试用主机安全产品Elkeid一、背景&#xff1a;什么是主机安全二、主机安全之Elkeid1. Elkeid 介绍2. Elkeid Server3. Elkeid Server 架构Elkeid AgentCenter&#xff08;下面简称AC&#xff09;Elkeid Service Discov…

[构建自己的 Vue 组件库] 小尾巴 UI 组件库

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…

Java(四)数组与类和对象

Java&#xff08;四&#xff09;数组与类和对象 六、数组&#xff08;非常重要&#xff09;1.定义2.遍历2.1遍历方法2.2Arrays方法 3.二维数组数组小总结 七、类和对象1. 定义&#xff08;重要&#xff09;1.1 类1.2 对象 2. this关键字&#xff08;重要&#xff09;2.1 特点 3…

方差分析的核心概念“方差分解“

方差是统计学中用来衡量数据集合中数值分散或离散程度的一种统计量。它表示了数据点与数据集合均值之间的差异程度&#xff0c;即数据的分散程度。方差越大&#xff0c;表示数据点更分散&#xff0c;而方差越小&#xff0c;表示数据点更集中。 方差的计算公式如下&#xff1a;…

自己开发一个接口文档页面html

演示效果 具体代码如下 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>框架框架文档页面</…

网络原理(一)网络基础,包括IP ,网络相关的定义

网络基础 以下图片是书上的网图。 什么是IP地址&#xff1f; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。P地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一…

电商(淘宝1688京东拼多多等)API接口服务:提升商业效率和用户体验的关键

电商API接口服务&#xff1a;提升商业效率和用户体验的关键 随着电子商务的飞速发展&#xff0c;电商企业需要不断提升自身的业务能力和服务质量&#xff0c;以应对日益激烈的市场竞争。为了更好地满足商家和消费者的需求&#xff0c;电商API接口服务应运而生。本文将探讨电商…

【进阶篇】Redis内存淘汰详解

文章目录 Redis内存淘汰详解0. 前言大纲Redis内存淘汰策略 1. 什么是Redis内存淘汰策略&#xff1f;1.1.Redis 内存不足的迹象 2. Redis内存淘汰策略3. 原理4. 主动和被动1. 主动淘汰1.1 键的生存周期1.2 过期键删除策略 2. 被动淘汰2.2 被动淘汰策略的实现 5. 项目实践优化策略…

【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…

MDK-Keil AC6 Compiler屏蔽特定警告

最近在使用STM32CubeMX生成MDK工程是&#xff0c;使用了 AC6 版本的编译器进行编译代码&#xff0c;然后发现了一些警告&#xff0c;但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告&#xff0c;这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…

CSS的break-inside 属性 的使用

break-inside 属性在 CSS 页码分隔模块中使用,它定义了一个元素内部是否允许发生页面、栏目或者区域的分隔。 break-inside有以下几个值 break-inside: avoid- 表示避免在该元素内部发生分页或者分栏。break-inside: auto - 默认允许分页break-inside: avoid-page - 避免页面…

【LeetCode题目详解】第九章 动态规划part07 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数 (day45补)

本文章代码以c为例&#xff01; 一、力扣第70题&#xff1a;爬楼梯 题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#x…

如何在 Ubuntu 上安装和使用 Nginx?

ginx&#xff08;发音为“engine-x”&#xff09;是一种流行的 Web 服务器软件&#xff0c;以其高性能和可靠性而闻名。它是许多流行网站使用的开源软件&#xff0c;包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。 它以…

[小尾巴 UI 组件库] 全屏响应式轮播背景图(基于 Vue 3 与 Element Plus)

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…

岩土工程安全监测利器:振弦采集仪的发展

岩土工程安全监测利器&#xff1a;振弦采集仪的发展 岩土工程安全监测是保障建筑物、地下工程和地质环境安全稳定运行的重要手段。传统上&#xff0c;监测手段主要依靠人工巡视以及基础设施安装的传感器&#xff0c;但是这些方法都存在着缺陷。人工巡视存在的问题是数据采集精…

用 Python 微调 ChatGPT (GPT-3.5 Turbo)

用 Python 微调 ChatGPT (GPT-3.5 Turbo) 备受期待的 GPT-3.5 Turbo 微调功能现已推出&#xff0c;并且为今年秋季即将发布的 GPT-4 微调功能奠定了基础。 这不仅仅是一次简单的更新——它是一个游戏规则改变者&#xff0c;为开发人员提供了完美定制人工智能模型的关键解决方案…

拥抱云原生,下一代边缘计算云基础设施

// 编者按&#xff1a;面对海量数据新的应用形态对低时延和分布式架构的需求&#xff0c;边缘计算将成为新一代边缘计算云基础设施&#xff0c;火山引擎覆盖了全国海量边缘节点&#xff0c;储备了上百T带宽&#xff0c;承载了视频直播、游戏娱乐、智慧交通、影视特效等多场景…

python官方标准库

文章目录 1. 标准库2. Python标准库介绍3. 示例 1. 标准库 https://docs.python.org/zh-cn/3/library/ https://pypi.org/ 2. Python标准库介绍 Python 语言参考手册 描述了 Python 语言的具体语法和语义&#xff0c;这份库参考则介绍了与 Python 一同发行的标准库。它还描…

前端uniapp块样式写法

<template><view class"block"><view class"block_box"><view class"block_box_content"><view class"block_box_left">左边</view><view class"block_box_right">右边</view…

【Nginx24】Nginx学习:压缩模块Gzip

Nginx学习&#xff1a;压缩模块Gzip 又是一个非常常见的模块&#xff0c;Gzip 现在也是事实上的 Web 应用压缩标准了。随便打开一个网站&#xff0c;在请求的响应头中都会看到 Content-Encoding: gzip 这样的内容&#xff0c;这就表明当前这个请求的页面或资源使用了 Gzip 压缩…