이동식 저장소

1033. 칵테일 본문

Problem Solving/BOJ

1033. 칵테일

해스끼 2020. 9. 7. 15:31

골2~플5 중 100명 이상 푼 문제를 풀고 있다.

 

1033번: 칵테일

august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다.  경근이는 인터넷 검색을 통해서 재료 쌍 N

www.acmicpc.net


칵테일의 재료 간 비율이 주어질 때, 각 재료의 양을 구해야 하는 문제이다. 이때 무게의 합이 가장 작아야 하므로 최소공배수를 이용하여 비율을 적절히 나누어야 한다.

 

a:b=p:qab의 쌍은 무한히 많지만, 가장 쉬운 쌍으로는 (a, b)=(abp, abq)가 있다. 우선 모든 무게를 1로 초기화한 다음 계산해 나가면 된다. 무게의 범위가 int 범위를 초과할 수 있으므로 64비트 정수형을 써야 안전하다.

 

그런데 ab만 바꿔서는 안 된다. 이미 이전에 a 또는 b와의 비율이 정해진 경우가 있기 때문이다. 예를 들어, 문제의 예제 중 세 번째 줄 4 1 3 1을 수행할 때는 4번 재료와 1번 재료뿐만 아니라 이전에 4번 재료와 비율이 정해져 있는 0번 재료에도 a의 변화를 동일하게 적용시켜야 한다. 만약 a에 10을 곱해야 한다면, a와 비율이 연동된 모든 값에도 10을 곱해야 한다는 뜻이다.

 

정답을 출력하기 전에 주의할 점이 있다. 위에서는 ab를 아주 단순하게 계산했으므로, ab가 서로소라는 보장이 없다. 따라서 모든 재료 값의 최소공배수(gcd)를 구한 다음, 모든 값을 gcd로 나누어야 정답을 구할 수 있다. 모든 값을 나눠야 하는 이유는 재료 비율의 쌍이 n1개 주어지므로 모든 재료의 비율이 연동되기 때문이다.

 

맞왜틀 (클릭)

입력으로 주어지는 pq가 서로소라는 보장이 없다. 0 1 9 9와 같은 입력이 주어질 수 있으므로 적절히 처리해야 한다.


어째서인지 런타임 에러가 엄청나게 났다.. 아마도 std::set의 합병과 관련이 있지 않나 싶다.

'Problem Solving > BOJ' 카테고리의 다른 글

1202. 보석 도둑  (0) 2020.09.17
1036. 36진수  (0) 2020.09.16
1007. 벡터 매칭  (0) 2020.08.29
11378. 열혈강호 4  (1) 2020.08.29
2019 KAPC 문제 풀이  (2) 2020.08.25
Comments