Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาจอบ เด็ก ๆ หลายคนจะได้ลูกอมพร้อม ๆ กับแจกจ่ายให้ตามกฏใน Python


สมมติว่าเรามีขนมอยู่ 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