คำอธิบายปัญหา
กำหนดลิสต์ความยาวสายริบบิ้น ribbons และ k ตัดสายได้อย่างอิสระ หา **ความยาว r สูงสุด** ที่ได้สาย k เส้นยาว r พอดี ไม่ได้คืน -1
ตัวอย่าง
ribbons = [1, 2, 5, 7, 15], k = 5 → Output: 5
- 15 → 3 เส้นยาว 5
- 7 → 1 เส้นยาว 5 (เหลือ 2)
- 5 → 1 เส้นยาว 5
- รวม 5 เส้น ✓
ขั้นตอนการแก้ปัญหา (Binary Search)
- ช่วงคำตอบ:
left=0, right=max(ribbons) - Mid = ความยาวลอง: นับจำนวนเส้น =
sum(ribbon // mid for ribbon in ribbons) - ถ้า ≥ k →
left = mid(ลองใหญ่ขึ้น) มิฉะนั้นright = mid - 1 - คืน
leftหาก > 0 มิฉะนั้น -1
การตนการทำงาน (Python)
def solve(ribbons, k):
left, right = 0, max(ribbons)
while left < right:
mid = (left + right + 1) // 2
if sum(ribbon // mid for ribbon in ribbons) >= k:
left = mid
else:
right = mid - 1
return left if left else -1
ribbons = [1, 2, 5, 7, 15]
k = 5
print(solve(ribbons, k)) # Output: 5
อินพุต / เอาต์พุต
Input: [1, 2, 5, 7, 15], 5 Output: 5