18111 - 마인크래프트

solution

code

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N, M, B;
    cin >> N >> M >> B;
    int * arr = new int[N*M];
    int max_arg = -1;
    int min_arg = 257;
    for(int i = 0; i < N*M; i++)
    {
        cin >> arr[i];
        max_arg = (max_arg < arr[i]) ? arr[i] : max_arg;
        min_arg = (min_arg > arr[i]) ? arr[i] : min_arg;
    }
    sort(arr, arr+N*M, greater<int>());
    
    int time = 0;
    int block = B;
    bool valid = true;
    pair<int, int> ans;
    ans.first = -1;
    for(int i = min_arg; i <= max_arg; i++)
    {
        block = B;
        time = 0;
        valid = true;
        for(int j = 0; j < N*M; j++)
        {
            if(arr[j] >= i)
            {
                time += (arr[j]-i) * 2;
                block += (arr[j]-i);
            }
            else
            {
                if(i - arr[j] > block) valid = false;
                else
                {
                    time += (i-arr[j]) * 1;
                    block -= (i-arr[j]);
                }
            }
        }
        if(ans.first == -1 && valid)
        {
            ans.first = time;
            ans.second = i;
        }
        else if(ans.first > time && valid)
        {
            ans.first = time;
            ans.second = i;
        }
        else if(ans.first == time && valid)
        {
            ans.first = time;
            ans.second = (i < ans.second) ? ans.second : i;
        }
    }

    cout << ans.first << " " << ans.second << endl;

    return 0;
}

ref

18111번: 마인크래프트