题目描述
给定数字A,B (A<B)和系数p,q。每次操作可以选择将A变成 A+p 或者将 p 变成 p*q。求至少几次操作使得 B <= A
输入描述
第一行数据组数T,对于每组数据,一行四个整数A,B,p,q。
1 <= A,p,B <= 10^9,2 <= q <= 10,1<= T <=5.
输出描述
对于每组数据,输出一个数字表示答案
解题思路
分析题目,如果走 A=A+p 这边,A增加只要一步;如果走p=pq这边,A在这步并不增加,A增加最少还需多加一步。所以先判断走 A=A+p 能否使 A >= B,如果可以就直接走这边结束;如果不行再判断连走哪边两部使A增加更多,即 p2 和 pq ,由于题目已经限制了q是一定大于等于2的,所以我们直接不用考虑这个问题。如果走 A=A+p 不能使 A >= B 那么就走 p=pq 这边。
代码如下
import java.util.Scanner;
/*
* 给定数字A,B (A<B)和系数p,q。
* 每次操作可以选择将A变成 A+p 或者将 p 变成 p*q。求至少几次操作使得 B <= A
*/
public class Exercise4 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for (int i = 0; i < T; i++) {
long A = in.nextInt();
long B = in.nextInt();
long p = in.nextInt();
int q = in.nextInt();
solution(A, B, p, q);
}
}
public static void solution(long A, long B, long p, int q) {
int count = 0;
while (A < B) {
if (A + p >= B) {
A = A + p;
} else {
p = p * q;
}
count++;
}
System.out.println(count);
}
}
输入
2
1 5 7 2
3 5 1 2
输出
1
2
注意: 这里 p*q 有可能会超出 int 范围,所以使用 long 型.