사용자 도구

사이트 도구


ps:problems:boj:32462

Construct a Coin Set

ps
링크acmicpc.net/…
출처BOJ
문제 번호32462
문제명Construct a Coin Set
레벨골드 2
분류

애드혹

시간복잡도O(T)
인풋사이즈T<=1000
사용한 언어Python 3.13
제출기록32412KB / 40ms
최고기록36ms
해결날짜2025/03/12

풀이

  • 동전 집합이 주어졌을때, 그리디 솔루션과 옵티멀 솔루션이 다른 값을 갖게 되는 최소 금액을 찾는 문제는 나름 유명한 문제이다. (Canonical Coin System 여부 체크하기 참고)
  • 여기에서는 역으로 그리디 솔루션과 옵티멀 솔루션이 다른 값을 갖게 되는 최소 금액이 주어졌을때, 거기에 해당하는 동전 집합을 만들라는 문제이다.
  • 가장 단순하게 구성해보면, N을 최적 방법으로는 2개의 동전으로 만들수 있지만, 그리디하게 만들면 3개의 동전이 필요하도록 할수 있다. 가장 싼 동전은 1로 고정되어있으므로 가장 비싼 동전이 N-2라면, 그리디 솔루션으로는 3개가 필요하다. 이제 남은 동전중에서 2개를 가지고 N을 만들수 있도록 추가해주기만 하면 된다. 나는 N이 짝수일때 N/2 동전을, 홀수일때 ceil(N/2)와 floor(N/2) 동전을 추가하도록 했다. 다른 사람들의 답을 보니 3와 N-3을 추가하는 좀 더 간단한 방식도 있었다. 어떻게 하든 N-1 까지는 그리디하게 구해도 옵티멀이 된다는 것은 쉽게 알 수 있다.
  • 그리고 어떻게 하든 최소 반례가 5 이하가 되는 동전 집합은 존재하지 않는다는 것도 쉽게 알수 있다.

코드

"""Solution code for "BOJ 32462. Construct a Coin Set".

- Problem link: https://www.acmicpc.net/problem/32462
- Solution link: http://www.teferi.net/ps/problems/boj/32462

Tags: [ad hoc]
"""

import sys
from teflib import psutils


@psutils.run_n_times
def main():
    N = int(sys.stdin.readline())

    if N <= 5:
        print('-1')
    elif N % 2 == 0:
        print('3')
        print(1, N // 2, N - 2)
    else:
        print('4')
        print(1, N // 2, (N + 1) // 2, N - 2)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
D Z K᠎ L M
 
ps/problems/boj/32462.txt · 마지막으로 수정됨: 2025/03/12 14:38 저자 teferi