คำชี้แจงปัญหา
ให้มอนสเตอร์ N ตัว มอนสเตอร์แต่ละตัวมีพลังชีวิตเริ่มต้น h[i] ซึ่งเป็นจำนวนเต็ม สัตว์ประหลาดจะมีชีวิตอยู่หากพลังชีวิตของมันมากกว่า 0
ในแต่ละเทิร์น มอนสเตอร์แบบสุ่มจะฆ่ามอนสเตอร์แบบสุ่มอีกตัวหนึ่ง ซึ่งเป็นมอนสเตอร์ที่ถูกโจมตี พลังชีวิตของมันจะลดลงตามจำนวนพลังชีวิตของมอนสเตอร์ที่โจมตี กระบวนการนี้จะดำเนินต่อไปจนกว่าจะเหลือมอนสเตอร์ตัวเดียว ค่าพลังชีวิตขั้นต่ำที่เป็นไปได้ของมอนสเตอร์ตัวสุดท้ายที่เหลืออยู่คือเท่าใด
ตัวอย่าง
หากอาร์เรย์อินพุตเป็น {2, 14, 28, 56} เอาต์พุตจะเป็น 2 เพราะเมื่อมีมอนสเตอร์ตัวแรกเท่านั้นที่โจมตีมอนสเตอร์ 3 ตัวที่เหลือ พลังชีวิตของมอนสเตอร์ตัวสุดท้ายจะเป็น 2 ซึ่งน้อยที่สุด
อัลกอริทึม
เราสามารถรับคำตอบสุดท้ายโดยใช้สูตร GCD ด้านล่าง -
H(นาที) =gcd(h1, h2, …, hn)
ตัวอย่าง
#include <iostream>
using namespace std;
int gcd(int a, int b) {
if (a == 0)
return b;
return gcd(b % a, a);
}
int getPossibleHealth(int* health, int n) {
int currentGcd = gcd(health[0], health[1]);
for (int i = 2; i < n; ++i) {
currentGcd = gcd(currentGcd, health[i]);
}
return currentGcd;
}
int main() {
int health[] = { 4, 6, 8, 12 };
int n = sizeof(health) / sizeof(health[0]);
cout << "Possible final health = " << getPossibleHealth(health, n) << endl;
return 0;
} ผลลัพธ์
เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้ -
Possible final health = 2