Problem Link : https://www.acmicpc.net/problem/1049
우선 패키지 중에 제일 값이 싼 패키지와 낱개 중 가장 값이 싼 낱개의 가격을 입력을 받는 동시에 구한다.
n, m = map(int, input().split())
min_package = 1000
min_each = 1000
for _ in range(m):
package, each = map(int, input().split())
min_package = min(package, min_package)
min_each = min(each, min_each)
기타줄을 살 때 2가지의 경우가 있을 수 있다.
필요한 기타 줄이 6개보다 많은 경우
패키지 가격과 6 * 낱개 가격 중 더 작은 값을 골라 6개씩 구매한다. 따라서 패키지 또는 낱개를 6개씩 구매할 수 있는 만큼 구매한다.따라서 다음과 같은 공식으로 쓸 수 있다.
필요한 기타 줄이 6개보다 적은 경우
패키지 가격과 남은 개수 * 날개 가격 중 더 작은 값을 골라 구매한다. 따라서 다음과 같은 공식으로 쓸 수 있다.
따라서 위 1번, 2번 케이스를 거쳐 최소 값을 구할 수 있다. n이 6보다 작을때에도 1번 경우에 포함시켜도 되는 이유는 n이 6보다 작으면 나눈 몫이 0이 나와서 값이 그대로 유지되기 때문이다. 따라서 결국 모든 케이스에 대해 다음과 같은 공식을 적용시킬 수 있다.
실제로 다음과 같이 코드로 구현했다.
ans = (n // 6) * min(min_package, min_each * 6) + min(min_package, min_each * (n % 6))
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
min_package = 1000
min_each = 1000
for _ in range(m):
package, each = map(int, input().split())
min_package = min(package, min_package)
min_each = min(each, min_each)
ans = (n // 6) * min(min_package, min_each * 6) + min(min_package, min_each * (n % 6))
print(ans)