ধরুন আমাদের কাছে সংখ্যা নামক সংখ্যার একটি তালিকা রয়েছে এবং দুটি মান, আকার এবং k। এখন ধরুন একটি অপারেশন আছে যেখানে আমরা দৈর্ঘ্যের আকারের একটি সংলগ্ন সাবলিস্ট নিই এবং প্রতিটি উপাদানকে এক করে বৃদ্ধি করি। আমরা এই অপারেশনটি k বার করতে পারি, আমাদের সংখ্যায় সম্ভাব্য সর্বনিম্ন মান খুঁজে বের করতে হবে।
সুতরাং, ইনপুট যদি nums =[2, 5, 2, 2, 7], সাইজ =3, k =2 এর মত হয়, তাহলে আউটপুট হবে 3, যেমন আমরা [2, 5, 2] বাড়াতে পারি। 3, 6, 3, 2, 7] এবং তারপর [3, 7, 4, 3, 7] পেতে [6, 3, 2] বৃদ্ধি করুন, সর্বনিম্ন হল 3
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- সম্ভব () একটি ফাংশন সংজ্ঞায়িত করুন। এটি লক্ষ্য গ্রহণ করবে
- ইভেন্ট :=N আকারের একটি তালিকা, এবং 0 দিয়ে পূরণ করুন
- চলবে :=0, s :=0
- আমি 0 থেকে N রেঞ্জের জন্য, কর
- s :=s + ঘটনা[i]
- ডেল্টা :=টার্গেট -(A[i] + s)
- যদি ডেল্টা> 0 হয়, তাহলে
- মুভস :=মুভ + ডেল্টা
- s :=s + ডেল্টা
- যদি i + সাইজ
- ইভেন্টস[i + সাইজ] :=ইভেন্ট[i + সাইজ] - ডেল্টা
- মাঝে :=(বাম + ডান + 1) / 2
- যদি সম্ভব (মধ্য), তারপর
- বামে :=মধ্য
- অন্যথায়,
- ডান:=মধ্য - 1
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
class Solution: def solve(self, A, size, K): N = len(A) def possible(target): events = [0] * N moves = s = 0 for i in range(N): s += events[i] delta = target - (A[i] + s) if delta > 0: moves += delta s += delta if i + size < N: events[i + size] -= delta return moves <= K left, right = 0, 10 ** 10 while left < right: mid = (left + right + 1)//2 if possible(mid): left = mid else: right = mid - 1 return left ob = Solution() nums = [2, 5, 2, 2, 7] size = 3 k = 2 print(ob.solve(nums, size, k))
ইনপুট
[2, 5, 2, 2, 7], 3, 2
আউটপুট
3