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

โปรแกรม Python หาจำนวนครั้งที่ลูกบอลจะชนกันในท่อกลม


สมมติว่ามีลูกบอลอยู่ n ลูกในท่อกลม ท่อยาว 100 เมตร เริ่มแรกแต่ละลูกในท่ออยู่ห่างจากจุดที่เราเรียกว่าจุดเริ่มต้น 1 เมตร ตอนนี้ลูกบอลเริ่มเคลื่อนที่ภายในท่อเป็นวงกลมในทิศทางต่างๆ ลูกบอลเดินทาง 0.1 เมตรต่อวินาทีภายในท่อ เมื่อลูกบอลสองลูกมาบรรจบกันที่จุดหนึ่ง จะเกิดการชนกันและลูกบอลจะเปลี่ยนทิศทางการเคลื่อนที่ หากกระบวนการนี้ใช้เวลานาน สมมติว่า 10^9 + 6 วินาที เราต้องหาจำนวนครั้งที่ลูกบอลชนกัน ระยะทางเริ่มต้นของลูกบอลจากจุดเริ่มต้นจะเป็นอินพุต

ดังนั้น หากอินพุตเป็นเหมือน input_array =[0, 10] เอาต์พุตจะเป็น 400,000

มีลูกบอลสองลูกและระยะทางเริ่มต้นจากเส้นเริ่มต้นนั้นมอบให้เราเป็นข้อมูลป้อนเข้า ถ้าทิศทางเดียวกัน จะไม่มีวันชนกัน แต่ถ้าทิศทางของพวกเขาแตกต่างกันพวกเขาจะชนกันในบางครั้ง ลูกหนึ่งจะชนกับอีก 400,000 ครั้งอย่างแน่นอน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • เรียงลำดับรายการ input_array
  • ขนาด :=ขนาดของ input_array
  • lap_count :=(10^5)*2
  • ผลลัพธ์ :=2 * lap_count * มูลค่าพื้นของ (ขนาด / 2) * (ขนาด - มูลค่าพื้นของ (ขนาด / 2))
  • หยุด :=0
  • สำหรับฉันในช่วง 0 ถึงขนาด - 1 ทำ
  • ถ้า stop ไม่เหมือนกับ 1 แล้ว
    • ถ้า input_array[i] + 1 เหมือนกับ input_array[i+1] แล้ว
      • เอาต์พุต :=เอาต์พุต + 2
      • หยุด :=1
    • มิฉะนั้น
      • หยุด :=0
  • มิฉะนั้น
    • หยุด :=0
  • ผลตอบแทนที่ได้

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def solve(input_array):
   input_array.sort()
   size = len(input_array)
   lap_count = (10**5)*2
   output = 2*lap_count*(size//2)*(size - size//2)
   stop = 0
   for i in range(size - 1):
      if stop != 1:
         if input_array[i] + 1 == input_array[i+1]:
            output+=2
            stop = 1
         else:
            stop = 0
      else:
         stop = 0
   return output
print(solve([0, 10]))

อินพุต

[0, 10]

ผลลัพธ์

400000