ps:problems:boj:18540
목차
Scored Nim
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 18540 |
문제명 | Scored Nim |
레벨 | 골드 1 |
분류 |
게임 이론 |
시간복잡도 | O(n) |
인풋사이즈 | n<=128 |
사용한 언어 | Python 3.11 |
제출기록 | 31256KB / 44ms |
최고기록 | 40ms |
해결날짜 | 2023/07/08 |
풀이
- 1개짜리 힙을 만들면, 그 힙의 색깔은 이후에 변하지 않는 확정적인 점수가 된다.
- n개짜리 힙 한개를 분할하기 시작하면, 어떤 식으로 분할하든 n-1턴 이후에 모든 분할이 끝난다. 자기턴에 확정점수를 최대 1점 만들수 있다. x개 힙을 1개 힙과 x-1개 힙으로 나누면 된다. 이것이 최적 행동이다.
- 둘다 최적전략을 쓰면, 짝수개짜리 힙은 선후공이 똑같이 나눠갖게 되고, 홀수개짜리 힙은 선공이 1점 더 많이 갖게 된다.
- 힙이 여러개라면, +1점을 얻을수 있는 홀수개짜리 힙이 짝수개라면, 선후공이 똑같은 갯수마다 +1을 받으므로 총점은 똑같이 나눠갖는다. 홀수개짜리 힙이 홀수개라면, 선공이 최종적으로 1점을 더 얻는다
- 좀더 일반화하면, 모든 힙의 돌의 합이 홀수라면 선공이 1점더 얻고, 짝수면 비긴다. 선공의 점수는 ceil(sum(a_i)/2) 이다
코드
"""Solution code for "BOJ 18540. Scored Nim".
- Problem link: https://www.acmicpc.net/problem/18540
- Solution link: http://www.teferi.net/ps/problems/boj/18540
Tags: [game theory]
"""
def main():
n = int(input()) # pylint: disable=unused-variable
a = [int(x) for x in input().split()]
print((sum(a) + 1) // 2)
if __name__ == '__main__':
main()
ps/problems/boj/18540.txt · 마지막으로 수정됨: 2023/07/08 11:43 저자 teferi
토론