ধরুন আমাদের একটি ধনাত্মক পূর্ণসংখ্যা x আছে, আমরা x (op1) x (op2) x (op3) x... যেখানে op1, op2 ইত্যাদি অপারেটর হবে তার একটি এক্সপ্রেশন লিখব। এবং এই অপারেটরগুলি যোগ, বিয়োগ, গুণ বা ভাগ হতে পারে। উদাহরণস্বরূপ, x =3 দিয়ে, আমরা 3 * 3 / 3 + 3 - 3 লিখতে পারি যা 3 এর মান। কিছু কিছু নিয়ম আছে, সেগুলি নিম্নরূপ -
-
বিভাগ অপারেটর (/) মূলদ সংখ্যা প্রদান করে।
-
কোথাও কোন বন্ধনী রাখা নেই।
-
আমরা ক্রিয়াকলাপের স্বাভাবিক ক্রম ব্যবহার করি - যোগ এবং বিয়োগের চেয়ে গুণ এবং ভাগের অগ্রাধিকার বেশি।
-
Unary negation অপারেটর অনুমোদিত নয়৷
আমাদের সর্বনিম্ন সংখ্যক অপারেটর সহ একটি অভিব্যক্তি লিখতে হবে যাতে অভিব্যক্তিটি প্রদত্ত লক্ষ্যের সমান হয়। সুতরাং, আমরা সর্বনিম্ন সংখ্যক অপারেটর খুঁজে পাব।
সুতরাং, ইনপুট যদি x =4, টার্গেট =15 এর মত হয়, তাহলে আউটপুট হবে 3, যেমন আমরা 15 কে 4*4- 4/4 হিসাবে প্রকাশ করতে পারি
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
যদি লক্ষ্য x এর মত হয়, তাহলে −
-
যদি x> টার্গেট হয়, তাহলে −
-
সর্বনিম্ন ফেরত দিন (x - লক্ষ্য) * 2 এবং (লক্ষ্য * 2) - 1
-
-
-
যোগফল :=x, t :=0
-
সমষ্টি
করার সময় -
যোগফল :=যোগফল * x
-
(t 1 দ্বারা বাড়ান)
-
-
যদি যোগফল টার্গেটের সমান হয়, তাহলে −
-
টি
ফেরত দিন
-
-
l :=inf, r :=inf
-
যদি যোগফল - লক্ষ্য লক্ষ্য, তারপর −
-
r :=leastOpsExpressTarget(x, sum - target)
-
-
l :=leastOpsExpressTarget(x, target - (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