[ 백준 ] 1052 / 물병

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
116/228
post-thumbnail

# Appreciation

/*
 * Problem :: 1052 / 물병
 *
 * Kind :: Brute Force
 *
 * Insight
 * - 같은 양의 물이 들어있는 물병 두 개를 고른다
 *   그 다음에 한 개의 물병에 다른 한 쪽에 있는 물을 모두 부은다
 *   1+1 = 2, 2+2 = 4, 4+4 = 8 ...
 *   + 이진수...? (2048 Game!)
 *     # 물병의 개수가 N 을 이진수로 표현했을 때 1의 개수이다!
 *
 * - (N, K) = (x, y) 라고 하면
 *   제일 시간이 오래걸리는 경우가
 *   (2^x + 1, 1) 과 같은 꼴이다
 *   + 2^23 < 10^7 < 2^24 이니까,
 *     (10^7, 1) 인 경우나 (2^22+1, 1) 인 경우가 제일 시간이 오래걸릴것 같은데...
 *     2^24 - 10^7 = 6777216, 2^22 = 4194304 이니까
 *     물병을 하나씩 더하면서 가능한지 다 따져보아도 괜찮을 것 같다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
int getNumBottles(int v);


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, K;
    cin >> N >> K;

    // Process
    /* 따져볼 범위는 그냥 max(N) 인 10e7 로 잡음 */
    for (int i=0; i<=10e7; i++) {
        /* i = 상점에서 산 물병의 개수 */
        int v = N+i; /* 총 v 리터 */
        int numBottles = getNumBottles(v); /* v 리터를 담은 물병의 개수 */
        /* v 리터를 담은 물병의 개수가 K 개 이하이면 */
        if (numBottles <= K) {
            // Control : Output
            cout << i << endl;
            exit(0);
        }
    }

    // Control : Output
    /* 불가능, 그러나 불가능할 수가 없기에 아래 코드는 실행되지는 않음 */
    cout << -1 << endl;
}

// Helper Functions
int getNumBottles(int v)
{
    int cnt = 0;
    while (v) {
        if (v % 2) cnt++;
        v /= 2;
    } return cnt;
}
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글