假设我们有一个正整数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