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

这篇具有很好参考价值的文章主要介绍了华为OD机考算法题:数字加减游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目部分

解读与分析

代码实现


题目部分

题目 数字加减游戏
难度
题目说明 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 s 变成数字 t 。
每个回合,小明可以用当前的数字加上或减去一个数字。
现在有两种数字可以用来加减,分别为 a, b (a≠b),其中 b 没有使用次数限制。
请问小明最少可以用多少次 a,才能将数字 s 变成数字 t 。
题目保证数字 s 一定能变成数字 t。
输入描述 输入的唯一一行包含四个正整数s,t,a,b(1≤s,t,a,b≤),并且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     y =  
2.  
b * y - a * x = n    y = 华为OD机考算法题:数字加减游戏,华为OD机考,华为od,算法,游戏,Java,Javascript,数据结构
3.  a * x + b * y = n   y = 
其中, 第 1 个 和 第 3 个 可以合并成 y = 。

在 y = 华为OD机考算法题:数字加减游戏,华为OD机考,华为od,算法,游戏,Java,Javascript,数据结构  y =  这两个等式中,它们的分母都能被 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 加  次与 b 加  次是相等的,因此 x 的取值范围可以进一步缩小到 0 ≤ x < 。

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

题目中提到,“题目保证数字 s 一定能变成数字 t”,那我们在从 x = 0 开始代入等式,每次增加 1 尝试等式是否成立时,无需去计算  的值,必定会在  之前求出 x 的值。

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

此时,   的最小公倍数变为原来的 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++;
    }

}

此题主要工作量在解题思路上,代码量非常少。

(完)文章来源地址https://www.toymoban.com/news/detail-704610.html

到了这里,关于华为OD机考算法题:数字加减游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【华为OD机考 统一考试机试C卷】亲子游戏(C++ Java JavaScript Python C语言)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。根据考友反馈:目前抽到的试卷为B卷或C卷/D卷,其中C卷居多 ,按照之前的经验C卷D卷部分考题会复用A卷/B卷题,博主正积极从考过的同学收集C卷和D卷真题,

    2024年01月21日
    浏览(51)
  • 【华为OD机考 统一考试机试C卷】螺旋数字矩阵(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年01月21日
    浏览(46)
  • 【华为OD机考 统一考试机试C卷】 游戏分组/王者荣耀(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年01月22日
    浏览(147)
  • 【华为OD机考 统一考试机试C卷】特殊的加密算法(C++ Java JavaScript Python C语言)

    真题目录:华为OD机考机试 真题目录( D卷 +C卷 + B卷 + A卷) + 考点说明 在线OJ:点击立即刷题,模拟真实机考环境 华为OD面试真题精选:华为OD面试真题精选 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。 规则如下: 明文为一段

    2024年04月16日
    浏览(43)
  • 【华为OD机考 统一考试机试C卷】素数之积/RSA加密算法(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年03月21日
    浏览(44)
  • 【华为OD机考 统一考试机试C卷】螺旋数字矩阵(Java题解)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。根据考友反馈:目前抽到的试卷为B卷或C卷/D卷,其中C卷居多 ,按照之前的经验C卷D卷部分考题会复用A卷/B卷题,博主正积极从考过的同学收集C卷和D卷真题,

    2024年02月02日
    浏览(62)
  • 【华为OD机考 统一考试机试C卷】 找座位(C++ Java JavaScript Python)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月04日
    浏览(51)
  • 【华为OD机考 统一考试机试C卷】高效货运(C++ Java JavaScript Python)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月03日
    浏览(46)
  • 【华为OD机考 统一考试机试C卷】找单词(C++ Java JavaScript Python)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。根据考友反馈:目前抽到的试卷为B卷或C卷/D卷,其中C卷居多 ,按照之前的经验C卷D卷部分考题会复用A卷/B卷题,博主正积极从考过的同学收集C卷和D卷真题,

    2024年02月02日
    浏览(50)
  • 【华为OD机考 统一考试机试C卷】分月饼(C++ Java JavaScript Python)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月02日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包