Skip to content

Commit 9ed171c

Browse files
committed
[Gold V] Title: 물병, Time: 0 ms, Memory: 2020 KB -BaekjoonHub
1 parent 485cdcf commit 9ed171c

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# [Gold V] 물병 - 1052
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1052)
4+
5+
### 성능 요약
6+
7+
메모리: 2020 KB, 시간: 0 ms
8+
9+
### 분류
10+
11+
수학, 그리디 알고리즘, 비트마스킹
12+
13+
### 제출 일자
14+
15+
2025년 5월 19일 10:55:42
16+
17+
### 문제 설명
18+
19+
<p>지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번에 K개의 물병을 옮길 수 있다. 하지만, 지민이는 물을 낭비하기는 싫고, 이동을 한 번보다 많이 하기는 싫다. 따라서, 지민이는 물병의 물을 적절히 재분배해서, K개를 넘지 않는 비어있지 않은 물병을 만들려고 한다.</p>
20+
21+
<p>물은 다음과 같이 재분배 한다.</p>
22+
23+
<blockquote>
24+
<p>먼저 같은 양의 물이 들어있는 물병 두 개를 고른다. 그 다음에 한 개의 물병에 다른 한 쪽에 있는 물을 모두 붓는다. 이 방법을 필요한 만큼 계속 한다.</p>
25+
</blockquote>
26+
27+
<p>이런 제약 때문에, N개로 K개를 넘지않는 비어있지 않은 물병을 만드는 것이 불가능할 수도 있다. 다행히도, 새로운 물병을 살 수 있다. 상점에서 사는 물병은 물이 1리터 들어있다.</p>
28+
29+
<p>예를 들어, N=3이고, K=1일 때를 보면, 물병 3개로 1개를 만드는 것이 불가능하다. 한 병을 또다른 병에 부으면, 2리터가 들어있는 물병 하나와, 1리터가 들어있는 물병 하나가 남는다. 만약 상점에서 한 개의 물병을 산다면, 2리터가 들어있는 물병 두 개를 만들 수 있고, 마지막으로 4리터가 들어있는 물병 한 개를 만들 수 있다.</p>
30+
31+
### 입력
32+
33+
<p>첫째 줄에 N과 K가 주어진다. N은 10<sup>7</sup>보다 작거나 같은 자연수이고, K는 1,000보다 작거나 같은 자연수이다.</p>
34+
35+
### 출력
36+
37+
<p>첫째 줄에 상점에서 사야하는 물병의 최솟값을 출력한다. 만약 정답이 없을 경우에는 -1을 출력한다.</p>
38+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <iostream>
2+
3+
using namespace std;
4+
5+
int main() {
6+
int N, K;
7+
cin >> N >> K;
8+
9+
int ans = 0;
10+
while (true) {
11+
int temp = N;
12+
int firstIdx = -1;
13+
14+
int cnt = 0;
15+
int idx = 0;
16+
while (temp) {
17+
if (temp & 1) {
18+
if (firstIdx == -1) firstIdx = idx;
19+
cnt++;
20+
}
21+
idx++;
22+
temp >>= 1;
23+
}
24+
25+
if (cnt <= K) break;
26+
N += (1 << firstIdx);
27+
ans += (1 << firstIdx);
28+
29+
}
30+
31+
cout << ans;
32+
33+
return 0;
34+
}

0 commit comments

Comments
 (0)