假设我们有一个正整数x,我们将写一个形式为x(op1)x(op2)x(op3)x ...的表达式,其中op1,op2等是运算符。这些运算符可以是加,减,乘或除。例如,在x = 3的情况下,我们可以写成3 * 3/3 + 3-3(其值为3)。有一些规则,如下所示-
除法运算符(/)返回有理数。
没有括号放在任何地方。
我们使用通常的运算顺序-乘法和除法的优先级高于加法和减法。
一元求反运算符是不允许的。
我们必须编写一个运算符数量最少的表达式,以使该表达式等于给定的目标。因此,我们将找到最少数量的运算符。
因此,如果输入像x = 4,target = 15,那么输出将是3,因为我们可以将15表示为4 * 4- 4/4
为了解决这个问题,我们将遵循以下步骤-
如果目标与x相同,则-
返回(x-目标)* 2和(target * 2)-1的最小值
如果x>目标,则-
和:= x,t:= 0
而总和<目标,做-
总和:=总和x
(将t增加1)
如果总和与目标相同,则-
返回t
l:= inf,r:= inf
如果sum-目标目标,则-
r:= minimumOpsExpressTarget(x,sum-target)
l:= minimumOpsExpressTarget(x,目标-(sum / x))
返回1 + l和r的最小值
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int leastOpsExpressTarget(int x, int target) {
if(target == x) return 0;
if(x > target){
return min((x - target) * 2, (target * 2) - 1);
}
lli sum = x;
int t = 0;
while(sum < target){
sum *= x;
t++;
}
if(sum == target) return t;
int l = INT_MAX;
int r = INT_MAX;
if(sum - target < target){
r = leastOpsExpressTarget(x, sum - target) + t;
}
l = leastOpsExpressTarget(x, target - (sum / x)) + t - 1;
return min(l, r) + 1;
}
};
main(){
Solution ob;
cout << (ob.leastOpsExpressTarget(4, 15));
}4, 15
输出结果
3