1697 - 숨바꼭질

solution

code

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

void calc(pair<int, int> arr[], int k)
{
    if(k == 1) return;
    if(k%2 == 0)
    {
        arr[k/2].second = (arr[k/2].second < arr[k].second + 1) ? arr[k/2].second : arr[k].second + 1;
        calc(arr, k/2);
    }
    else
    {
        arr[k/2].second = (arr[k/2].second < arr[k].second + 2) ? arr[k/2].second : arr[k].second + 2;
        arr[(k/2)+1].second = (arr[(k/2)+1].second < arr[k].second + 2) ? arr[(k/2)+1].second : arr[k].second + 2;
        calc(arr, k/2);
        calc(arr, (k/2)+1);
    }
}

int main()
{
    int N, K;
    cin >> N >> K;
    if(K <= N) cout << N - K << endl; 
    else
    {
        pair<int, int> * arr = new pair<int, int>[K+1];
        for(int i = 0; i <= K; i++) arr[i] = {i, K-i};
        calc(arr, K);

        vector<pair<int, int>> point;
        for(int i = 0; i < K; i ++)
           point.push_back(arr[i]);
        
        int min = 999999;
        for(auto p : point)
            min = (min < p.second + abs(p.first - N)) ? min : p.second + abs(p.first - N);
        cout << min << endl;      
    }
    return 0;
}

ref

1697번: 숨바꼭질

글 읽기 - 반례, 지적 부탁드릴게요ㅠㅠ

유향 비순환 그래프