쌓고 쌓다
[백준] 마인크래프트 18111번 C++ 풀이 본문
https://www.acmicpc.net/problem/18111
모든 높이 ( 0~256 )에 대해 브루트 포스를 진행해도 정답은 처리가 되는 거 같습니다.
입력받은 최소높이~최대높이에 대해 땅 고르기 작업을 진행해서 최소 시간과 높이를 구하면 됩니다.
먼저 solve함수에서 만들 높이에 대해 높은 땅을 먼저 깎아주고 깎은 블럭 개수만큼 인벤토리에 담고, 시간을 더해줍니다.
그리고 높이에 대해 낮은 땅들을 올려주는 작업을 해주면 됩니다.
이에 남은 블럭이 0 이상이면 최소 시간을 초기화시켜주고 최소 시간이라면 최대 높이를 찾아줍니다.
#include <iostream>
#include <algorithm>
using namespace std;
int N, M, B;
int arr[500][500];
int low = 999, high = -1;
int Time=987654321, hres=-1;
void solve(int h,int b)
{
int ptime = 0;
for(int i=0;i<N;i++)
for (int j = 0; j < M; j++)
{
if (arr[i][j] > h)
{
b += arr[i][j] - h;
ptime += 2* (arr[i][j] - h);
}
}
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
{
if (arr[i][j] < h)
{
b -= h- arr[i][j];
ptime += 1 * (h- arr[i][j]);
}
}
if (b >= 0)
{
Time = min(Time, ptime);
if(Time==ptime)
hres = max(hres, h);
}
}
int main(void)
{
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> N >> M >> B;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
{
cin >> arr[i][j];
low = min(low, arr[i][j]);
high = max(high, arr[i][j]);
}
for (int i = low; i <= high; i++)
solve(i, B);
cout << Time << " " << hres;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 카드 구매하기2 16194번 C++ 풀이 (0) | 2021.12.23 |
---|---|
[백준] 1로 만들기2 12852번 C++ 풀이 (0) | 2021.12.22 |
[백준] 그림 1926번 C++ 풀이 (0) | 2021.12.21 |
[백준] 숫자판 점프 2210번 C++ 풀이 (0) | 2021.12.20 |
[백준] 다리 만들기2 17472번 C++ 풀이 (0) | 2021.12.19 |
Comments