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

ค้นหาจำนวนการกระโดดเพื่อไปถึง X ในเส้นจำนวนจากศูนย์ใน C++


สมมติว่าเรามีจำนวนเต็ม X เราต้องหาจำนวนการกระโดดขั้นต่ำที่จำเป็นในการไปถึง X จาก 0 การกระโดดครั้งแรกสามารถมีความยาวได้หนึ่งหน่วย และการกระโดดแต่ละครั้งจะยาวกว่าการกระโดดครั้งก่อนหนึ่งหน่วย อนุญาตให้ไปทางซ้ายหรือขวาในการกระโดดแต่ละครั้ง ดังนั้นหาก X =8 ผลลัพธ์จะเป็น 4. 0 → -1 → 1→ 4 → 8 เป็นสเตจที่เป็นไปได้

หากสังเกตดีๆ เราสามารถพูดได้ว่า

  • หากคุณกระโดดไปในทิศทางที่ถูกต้องเสมอ หลังจาก n กระโดด คุณจะอยู่ที่จุด p =1 + 2 + 3 + … + n
  • ถ้าเราสามารถกระโดดไปทางซ้ายได้เช่นกัน เมื่อกระโดดที่ k คุณจะอยู่ที่จุด p – 2k
  • ถ้าเราเลือกให้ดีว่ากระโดดไหนไปทางซ้ายและกระโดดไปทางขวา หลังจาก n ครั้งกระโดด คุณจะอยู่ที่จุดระหว่าง n(n+1)/2 และ –(n*(n+1) / 2 ) โดยมีค่าเท่ากันกับ n(n+1)/2

ตัวอย่าง

#include<iostream>
#include<cmath>
using namespace std;
inline int sumOneToN(int n) {
   return (n * (n + 1)) / 2;
}
int jumps(int n) {
   n = abs(n);
   int ans = 0;
   while (sumOneToN(ans) < n or (sumOneToN(ans) - n) & 1)
      ans++;
   return ans;
}
int main() {
   int n = 9;
   cout << "Number of jumps: " << jumps(n);
}

ผลลัพธ์

Number of jumps: 5