สมมติว่าเรามีขนมอยู่ k จำนวน เราต้องแจกจ่ายให้กับเด็กๆ ตอนนี้มีกฎบางอย่าง
- ลูกจะได้รับ i^2 จำนวนลูกอม
- เด็กที่ดัชนีฉันจะไม่ได้รับขนมใดๆ จนกว่าเด็กทุกคนจากดัชนี 1 ถึง i-i จะได้รับบริการ
- หากลูกๆ ไม่ได้รับลูกอม i^2 จำนวน นั่นถือว่าไม่ใช่การเสิร์ฟที่ถูกต้อง
ดังนั้น ถ้าอินพุตเท่ากับ k =20 ผลลัพธ์จะเป็น 3 เพราะอันแรกจะได้ 1 อันที่สองจะได้ 2^2 =4 อันที่สามจะได้ 3^2 =9 แต่อันที่สี่ต้องการ 4 ^2 =16 แต่เรามีลูกอมเหลืออยู่เพียง 6 ลูก ดังนั้นนี่ไม่ใช่การแจกจ่ายที่ถูกต้อง ดังนั้นจะเสิร์ฟลูกเพียงสามคนเท่านั้น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ซ้าย :=0, ขวา :=k
- ขณะขวา-ซ้าย> 1 ทำ
- กลาง :=ชั้นของ (ซ้าย + ขวา) / 2
- ถ้าชั้นของ (กลาง * (กลาง + 1) * (2 * กลาง + 1) / 6)> k แล้ว
- ขวา :=กลาง
- มิฉะนั้น
- ซ้าย :=กลาง
- ถ้าใช่ *(ขวา + 1) *(2 * ขวา + 1) <=k * 6 แล้ว
- กลับขวา
- กลับซ้าย
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(k): left = 0 right = k while (right - left > 1): mid = (left + right) // 2 if (mid * (mid + 1) * (2 * mid + 1) // 6 > k): right = mid else: left = mid if (right * (right + 1) * (2 * right + 1) <= k * 6): return right return left k = 20 print(solve(k))
อินพุต
20
ผลลัพธ์
3