题目描述
小Q从牛博士那里获得了一个数字转换机,这台数字转换机必须同时输入两个正数a和b,并且这台数字转换机有一个红色的按钮和一个蓝色的按钮:
当按下了红色按钮,两个数字同时加1。
当按下了蓝色按钮,两个数字同时乘2。
小Q现在手中有四个整数a,b,A,B,他希望将输入的两个整数a和b变成A,B(a对应A,b对应B)。因为牛博士允许小Q使用数字转换机的时间有限,所以小Q希望按动按钮的次数越少越好。请你帮帮小Q吧。
输入描述:
输入包括一行,一行中有四个正整数a,b,A,B,(1≤a,b,A,B≤10^9)。
输出描述:
如果小Q可以完成转换,输出最少需要按动按钮的次数,否则输出-1。
示例1
输入
100 1000 202 2002
输出
2
思路:乘法快,优先考虑乘法,然后加法,每次a,b小于A,B,再次递归,直至a==A,b==B或者a>A,b>B。
import java.util.Scanner;
public class Tencent01 {
public static void main(String args[]){
Scanner in = new Scanner(System.in);
String input = in.nextLine();
String[] inputs = input.split(" ");
int[] ins = new int[4];
int times = -1;
for (int i=0; i<4; i++){
ins[i] = Integer.parseInt(inputs[i]);
}
if (ins[0]<1 || ins[0]>(10^9) || ins[0]>ins[2] || ins[1]<1 || ins[1]>(10^9) || ins[1]>ins[3] ||
ins[2]<1 || ins[2]>(10^9) || ins[3]<1 || ins[3]>(10^9)){
times = -1;
} else {
times = change(ins[0], ins[1], ins[2], ins[3]);
}
System.out.println(times);
}
public static int change(int a,int b,int A,int B){
int time = 0;
if (a == A && b == B){
time = 0;
} else {
if (2*a < A && 2*b < B){
time ++;
time += change(2*a,2*b,A,B);
}
if (a+1 < A && b+1 < B){
time ++;
time += change(a+1,b+1,A,B);
}
if (a > A || b>B){
time = -1;
}
}
return time;
}
}

本文探讨了一种数字转换机的问题,该机器通过增加和翻倍操作将一对初始数值转换为目标数值。文章提出了一种策略,即优先考虑乘法操作以快速逼近目标,随后进行加法调整,以实现最小化操作次数的目标。通过递归算法,文章提供了解决方案并附带示例说明。
906

被折叠的 条评论
为什么被折叠?



