สมมติว่าเรามีตัวเลขสองตัว a และ b เพื่อนสองคนอยู่ที่ตำแหน่ง x =a และ x =b บนแกน OX เพื่อนแต่ละคนสามารถเคลื่อนที่ไปทีละเส้นในทิศทางใดก็ได้ไม่จำกัดจำนวนครั้ง โดยการเคลื่อนไหว ความเหนื่อยล้าของเพื่อนจะเปลี่ยนไปตามกฎต่อไปนี้ ท่าแรกเพิ่มความเหนื่อยล้า 1 ท่า ท่าที่สองเพิ่มความเหนื่อยล้า 2 ต่อไปเรื่อยๆ สองคนต้องการพบจุดจำนวนเต็มหนึ่งจุดบนแกน OX เราต้องหาค่าความเหนื่อยล้าขั้นต่ำที่ควรได้รับ
ดังนั้นหากอินพุตเป็นเหมือน a =5; b =10 จากนั้นผลลัพธ์จะเป็น 9 เนื่องจากวิธีที่เหมาะสมวิธีหนึ่งมีดังต่อไปนี้ เพื่อนคนแรกควรขยับไปทางขวา 3 ก้าว และเพื่อนคนที่สองก้าวไปทางซ้าย 2 ก้าว ดังนั้น ความเหนื่อยล้าทั้งหมดจึงกลายเป็น 1 + 2 + 3 + 1 + 2 =9.
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
ans := |a - b| sum := ans / 2 return (sum + (ans mod 2)) * (sum + 1)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; int solve(int a, int b){ int ans = abs(a - b); int sum = ans / 2; return (sum + (ans % 2)) * (sum + 1); } int main(){ int a = 5; int b = 10; cout << solve(a, b) << endl; }
อินพุต
5, 10
ผลลัพธ์
9