สมมติว่ามีลูกบอลอยู่ 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
- ถ้า input_array[i] + 1 เหมือนกับ input_array[i+1] แล้ว
- มิฉะนั้น
- หยุด :=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