백준 18111번: 마인크래프트

9224 단어 백준cppcpp

문제

문제 바로가기> 백준 18111번: 마인크래프트

풀이

문제를 제대로 이해하지 못해 꽤 틀린 후 맞출 수 있었다. 그냥 모든 경우의 수를 돌면서 최소 시간 조건을 만족한다는 전제하에 땅의 높이가 가장 높아지도록 정답을 설정해주었다. 땅의 높이가 0~256까지 가능하므로 0~256까지 반복문을 돌면서 다음 두 가지 조건(tmp<=time && btmp<=b)을 만족하는 경우 정답을 update해주었다. tmp<=time에서 작은 경우가 아니라 같거나 작은 경우로 하여 최소 시간 조건 일 때 땅의 최대 높이를 보장할 수 있다.

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

int main(){
    int n, m, b; cin>>n>>m>>b;
    int h[n][m] = {};
    int num[257] = {};
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++) {
            cin>>h[i][j];
            num[h[i][j]]++;
        }
    }
    int time=2100000000, height=0;
    for(int i=0; i<257; i++){
        int tmp=0, btmp=0;
        for(int j=0; j<n; j++){
            for(int k=0; k<m; k++){
                if(i<h[j][k]) {
                    tmp+=(h[j][k]-i)*2;
                    btmp-=(h[j][k]-i);
                }
                else if(i>h[j][k]){
                    tmp+=(i-h[j][k]);
                    btmp+=(i-h[j][k]);
                }
            }
        }
        if(tmp<=time && btmp<=b){
            time = tmp;
            height = i;
        }
    }
    cout << time << ' ' << height;
}

좋은 웹페이지 즐겨찾기