문제 설명
N명의 몬스터가 주어지면 각 몬스터는 정수인 초기 체력 h[i]를 가집니다. 생명력이 0보다 크면 몬스터가 살아 있습니다.
매 턴마다 무작위 몬스터는 다른 무작위 몬스터를 죽입니다. 공격을 받은 몬스터의 생명력은 공격하는 몬스터의 생명력만큼 감소합니다. 이 과정은 하나의 몬스터가 남을 때까지 계속됩니다. 마지막 남은 몬스터의 가능한 최소 체력은 얼마입니까?
예시
입력 배열이 {2, 14, 28, 56}이면 첫 번째 몬스터만 나머지 3마리의 몬스터를 계속 공격할 때 마지막 몬스터의 최종 체력이 최소인 2가 되기 때문에 출력은 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