华为OD题目:数字加减游戏

华为OD题目:数字加减游戏

知识点广搜
时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述
小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t。
每个回合,小明可以用当前的数字加上或减去一个数字。
现在有两种数字可以用来加减,分别为a,b(a!=b),其中b没有使用次数限制.
请问小明最少可以用多少次a,才能将数字s变成数字t。
题目保证数字s一定能变成数字t。

输入描述:
输入的唯一一行包含四个正整数s,t,a,b(1<=s,t,a,b<=105),并且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和-a同时存在,则正负相抵,啥都没做但已经使用了2次,所以可得-a和+a只能有一个存在,则存在下面三种情况:
a、s-ai+bj=t -> t-(s-ai)=bj -> (t-(s-ai))%b=0
b、s+a
i+bj=t -> t-(s+ai)=bj -> (t-(s+ai))%b=0
C、s+ai-bj=t -> t-(s+ai)=bj -> (t-(s+a*i))%b=0
这样一来就很清楚了。
t减去 s对a的递增或者递减 整除 b,递增或者递减的次数则是a的使用次数。增递减同时进行,先整除b的则是最小使用次数.

package com.darling.boot.order.odt.odt8;

import java.util.Scanner;

/**
 * 数字加减游戏
 * 知识点广搜
 * 时间限制: 1s 空间限制: 256MB 限定语言: 不限
 * 题目描述
 * 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t。
 * 每个回合,小明可以用当前的数字加上或减去一个数字。
 * 现在有两种数字可以用来加减,分别为a,b(a!=b),其中b没有使用次数限制.
 * 请问小明最少可以用多少次a,才能将数字s变成数字t。
 * 题目保证数字s一定能变成数字t。
 *
 * 输入描述:
 * 输入的唯一一行包含四个正整数s,t,a,b(1<=s,t,a,b<=105),并且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和-a同时存在,则正负相抵,啥都没做但已经使用了2次,所以可得-a和+a只能有一个存在,则存在下面三种情况:
 * a、s-a*i+b*j=t -> t-(s-a*i)=b*j  -> (t-(s-a*i))%b=0
 * b、s+a*i+b*j=t -> t-(s+a*i)=b*j  -> (t-(s+a*i))%b=0
 * C、s+a*i-b*j=t -> t-(s+a*i)=b*j  -> (t-(s+a*i))%b=0
 * 这样一来就很清楚了。
 * t减去 s对a的递增或者递减 整除 b,递增或者递减的次数则是a的使用次数。增递减同时进行,先整除b的则是最小使用次数.
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] strings = line.split(" ");
        int s = Integer.parseInt(strings[0]);
        int t = Integer.parseInt(strings[1]);
        int a = Integer.parseInt(strings[2]);
        int b = Integer.parseInt(strings[3]);

        int res = 0;

        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            if ((t - (s + a * i)) % b == 0) {
                res = i;
                break;
            }
            if ((t - (s - a * i)) % b == 0) {
                res = i;
                break;
            }

        }
        System.out.println(res);

    }




}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值