ในปัญหานี้ เราได้รับจำนวนเต็มสี่ตัวที่แสดงถึงจุดเริ่มต้นและการกระโดดที่แต่ละคนใช้ในการแข่งขัน งานของเราคือ ค้นหาว่าคนสองคนเคยเจอกันหรือไม่หลังจากกระโดดเท่ากัน
คำอธิบายปัญหา: ในที่นี้เราต้องตรวจสอบว่าคนสองคนเริ่มต้นที่จุด p1 และ p2 กระโดด j1 และ j2 จะอยู่ถึงจุดหนึ่งในเส้นทางหรือไม่
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: p1 =5, p2 =9, j1 =4, j2 =2
ผลลัพธ์: ใช่
คำอธิบาย:
หลังจากกระโดดครั้งแรก p1 =9, p2 =11
หลังจากกระโดดครั้งที่สอง p1 =13, p2 =13
แนวทางแก้ไข:
สำหรับการพบกันในบางจุด คนทั้งสองจะต้องกระโดดไกลกัน นี่คือเงื่อนไขบางประการที่จะต้องปฏิบัติตามเพื่อตรวจสอบว่าการพบปะผู้คนเป็นไปได้หรือไม่
ถ้า p1> p2 แล้ว s1 ต้องน้อยกว่า s2
และ ( (p2 - p1) % (s1 - s2) ) ==0
แล้วการประชุมก็เป็นไปได้ มิฉะนั้นจะเป็นไปไม่ได้
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<iostream> using namespace std; bool WillMeet(int p1, int j1, int p2, int j2){ return ( (j1 > j2 && ( ((p2 - p1) % (j1 - j2)) == 0)) || (j2 > j1 && ( ((p1 - p2) % (j2 - j1)) == 0)) ); } int main() { int p1 = 5, j1 = 4, p2 = 9, j2 = 2; if(WillMeet(p1, j1, p2, j2)) cout<<"Both will meet at some point"; else cout<<"Both will not meet at any point"; return 0; }
ผลลัพธ์
Both will meet at some point