তিনটি মান n, total, এবং k দেওয়া আছে। আকার n এর একটি লিস্ট বিবেচনা করুন যেসবের যোগফল total এবং যেকোনো দুটি সন্নিহিত উপাদানের মধ্যে পরম পার্থক্য hoogstens 1। এমন লিস্টের ইনডেক্স k-এ পাওয়া যেতে পারে সর্বোচ্চ মান কত তা বের করুন।
উদাহরণ: n = 5, total = 15, k = 3 হলে আউটপুট 4। সম্ভাব্য লিস্ট: [3, 2, 3, 4, 3], ইনডেক্স ৩-এ সর্বোচ্চ মান ৪।
সমাধানের পদ্ধতি
বাইনারি সার্চের মাধ্যমে উত্তর x (ইনডেক্স k-এ মান) খুঁজে বের করা হয়। x দিয়ে লিস্ট বানানোর মিনিমাম যোগফল ক্যালকুলেট করুন।
x= ইনডেক্সk-এ মান।- বাম পাশে (
k+1টি উপাদান): মানগুলোx, x-1, x-2, ...কমতে পারে। মিনিমাম যোগফল = অ্যারিথমেটিক সিরিজ। - ডান পাশে (
n-kটি উপাদান): একইভাবে কমতে পারে। - মোট মিনিমাম যোগফল
sক্যালকুলেট করুন। যদিs > totalহয়, তবেxখুব বড়। - বাইনারি সার্চ দিয়ে সর্বোচ্চ বৈধ
xবের করুন।
পাইথন কোড
def solve(n, total, k):
x = 0
while True:
# বাম পাশের মিনিমাম যোগফল
a = k + 1
s = (x + x - a + 1) * a // 2
# ডান পাশের মিনিমাম যোগফল
a = n - k
s += (x + x - a + 1) * a // 2
# x দুবার কাউন্ট হয়েছে, একবার বাদ দিন
s -= x
if s > total:
break
x += 1
return x - 1
# টেস্ট
n = 5
total = 15
k = 3
print(solve(n, total, k)) # আউটপুট: 4
সময় জটিলতা
O(√total) - x বাড়তে থাকলে যোগফল квадраটিক বাড়ে, তাই লুপ প্রায় √total বার চলে। বাইনারি সার্চ দিয়ে O(log total) সম্ভব।