สมมติว่าเรามีค่า n และรายการคู่อื่นที่เรียกว่าข้อจำกัด เราต้องการสร้าง 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 :=จัดเรียงข้อ จำกัด ของรายการตาม id
-
k :=0
-
idx :=1
-
สำหรับแต่ละ re ใน resi ทำ
-
re[1] :=ขั้นต่ำของ re[1] และ (k+re[0]-idx)
-
k :=re[1]
-
idx :=re[0]
-
-
k :=ความสูงสูงสุดขององค์ประกอบสุดท้ายใน resi
-
idx :=id ขององค์ประกอบสุดท้ายใน resi
-
ย้อนกลับรายการ resi
-
สำหรับแต่ละ re in resi ตั้งแต่ข้อแรกเป็นต้นไป ทำ
-
re[1] :=ขั้นต่ำของ re[1] และ (k-re[0]+idx)
-
k :=re[1]
-
idx :=re[0]
-
-
ย้อนกลับรายการ resi
-
ฉ :=0
-
idx :=1
-
res :=0
-
สำหรับแต่ละ re ใน resi ทำ
-
ff :=ขั้นต่ำของ (f+re[0]-idx) และ re[1]
-
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