ধরুন আমাদের একটি মান n এবং জোড়ার আরেকটি তালিকা আছে যাকে সীমাবদ্ধতা বলা হয়। আমরা একটি শহরে নতুন ভবন নির্মাণ করতে চাই। কিন্তু কিছু বিধিনিষেধ আছে। আমরা একটি লাইনে তৈরি করতে পারি এবং ভবনগুলিকে 1 থেকে n পর্যন্ত লেবেল করা হয়। বিধিনিষেধের দুটি প্যারামিটার আছে, তাই সীমাবদ্ধতা[i] =(id_i, max_height_i) নির্দেশ করে id_i-এর উচ্চতা max_height_i এর থেকে কম বা সমান হতে হবে। নতুন ভবনগুলির উচ্চতার উপর শহরের সীমাবদ্ধতাগুলি নিম্নরূপ -
৷-
প্রতিটি বিল্ডিংয়ের উচ্চতা অবশ্যই 0 বা ধনাত্মক মান হতে হবে।
-
প্রথম বিল্ডিং উচ্চতা 0 হতে হবে.
-
যেকোনো দুটি সংলগ্ন ভবনের উচ্চতার মধ্যে পার্থক্য 1 এর বেশি হতে পারে না।
আমাদের সবচেয়ে উঁচু ভবনের সর্বোচ্চ সম্ভাব্য উচ্চতা খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুটটি n =5, সীমাবদ্ধতা =[[2,1], [4,3]] এর মত হয়, তাহলে আউটপুট হবে 4 কারণ আমাদের সর্বোচ্চ সম্ভাব্য উচ্চতা খুঁজে বের করতে হবে, তাই এটি 4 হতে পারে যেমন দেখানো হয়েছে ডায়াগ্রাম।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
যদি সীমাবদ্ধতা খালি হয়, তাহলে
-
রিটার্ন n-1
-
-
resi :=আইডির উপর ভিত্তি করে তালিকার সীমাবদ্ধতাগুলি সাজান
-
k :=0
-
idx :=1
-
প্রতিটি resi এর জন্য, করুন
-
re[1] :=সর্বনিম্ন re[1] এবং (k+re[0]-idx)
-
k :=পুনরায়[1]
-
idx :=re[0]
-
-
k :=রেসিতে শেষ উপাদানের সর্বোচ্চ উচ্চতা
-
idx :=resi এ শেষ উপাদানের id
-
তালিকাটি উল্টো করুন
-
প্রথম আইটেম থেকে পরবর্তী প্রতিটির জন্য, করুন
-
re[1] :=সর্বনিম্ন re[1] এবং (k-re[0]+idx)
-
k :=পুনরায়[1]
-
idx :=re[0]
-
-
তালিকাটি উল্টো করুন
-
f :=0
-
idx :=1
-
res :=0
-
প্রতিটি resi এর জন্য, করুন
-
ff :=সর্বনিম্ন (f+re[0]-idx) এবং re[1]
-
res :=res এর সর্বোচ্চ এবং ভাগফল (re[0] - idx + f + ff)/2
-
idx :=re[0]
-
f :=ff
-
-
সর্বোচ্চ (f+n-idx) এবং res
ফেরত দিন
উদাহরণ
আসুন আরও ভালভাবে বোঝার জন্য নিম্নলিখিত বাস্তবায়ন দেখি
def solve(n, restrictions):
if not restrictions:
return n-1
resi = sorted(restrictions, key = lambda x:x[0])
k = 0
idx = 1
for re in resi:
re[1] = min(re[1], k+re[0]-idx)
k = re[1]
idx = re[0]
k = resi[-1][1]
idx = resi[-1][0]
resi.reverse()
for re in resi[1:]:
re[1] = min(re[1], k-re[0]+idx)
k = re[1]
idx = re[0]
resi.reverse()
f = 0
idx = 1
res = 0
for re in resi:
ff = min(f+re[0]-idx, re[1])
res = max(res, (re[0] - idx + f + ff) // 2)
idx = re[0]
f = ff
return max(f+n-idx,res)
n = 5
restrictions = [[2,1],[4,3]]
print(solve(n, restrictions)) ইনপুট
5, [[2,1],[4,3]]
আউটপুট
4