PS
BOJ 1052 : 물병
lickelon
2024. 7. 2. 16:33
- 문제 링크 : boj.kr/1052
- 난이도 : G5
- 태그 : 그리디, 비트마스킹
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, k;
cin >> n >> k;
bitset<32> bt;
int ans = 0;
while(true) {
bt = bitset<32>(n);
if(bt.count() <= k) break;
for(int i = 0; i < bt.size(); i++) {
if(bt[i]) {
ans += 1 << i;
n += 1 << i;
break;
}
}
}
cout << ans;
return 0;
}
풀이
일단 가능한 만큼 합쳐보자. 그러면 N을 이진수로 나타냈을 때 1의 수만큼 물병이 남게 된다.
낮은 자리수의 1부터 없애가며 처리하면 쉽게 해결할 수 있다.
728x90