땅의 최소높이, 최대높이를 구해둔다.
목표 높이 h 를 최소높이 부터 최대 높이 까지 도는 반복문을 만든다.
반복문 안에서 모든 땅을 h로 만들기 위해 걸리는 시간을 구한다.
반복문 안에 필요한 지역변수는 inven 과 time 이다.
반복문 한 바퀴가 끝났을 때 인벤이 음수라면, 실패니까 지나간다.
인벤이 0이상이라면, 최소 시간일 때 시간을 갱신한다. 또한 같은 시간이라도, 땅의 높이가 더 높다면 땅의 높이를 갱신해준다.
#include <bits/stdc++.h>
using namespace std;
int n, m, b;
int min_height = 256, max_height = 0;
int min_time = 1e9, block_height = 0;
int ground[502][502];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> b;
for(int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) { // 블록의 최소 높이와 최대 높이 구하기
cin >> ground[i][j];
min_height = min(min_height, ground[i][j]);
max_height = max(max_height, ground[i][j]);
}
}
// 목표 높이 h : 최소 높이~ 최대 높이 모두 검사한다.
for(int h = min_height; h <= max_height; h++){
int temp_time = 0;
int inven = b;
int diff = 0; // 목표높이 h와 현재 땅의 높이 차이
for(int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) { // 블록의 최소 높이와 최대 높이 구하기
diff = abs(ground[i][j] - h);
if(ground[i][j] < h) { // 낮다면, 시간 2씩 더하고, 인벤에서 꺼내서 쌓아준다
temp_time += diff;
inven -= diff;
}
else if (ground[i][j] > h){ // 높다면, 시간 1씩 더하고, 인벤에 옮긴다
temp_time += (2 * diff);
inven += diff;
}
}
}
if(inven >= 0){
min_time = min(min_time, temp_time);
// 답이 여러 개 있다면 그중에서 땅의 높이가 가장 높은 것을 출력
if(temp_time == min_time) block_height = max(block_height, h);
}
}
cout << min_time << " " << block_height;
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
좌표 압축 백준 18870번 c++ (0) | 2022.02.16 |
---|---|
수 정렬하기 2 백준 2751번 c++ (0) | 2022.02.16 |
방 번호 백준 1475번 c++ (0) | 2022.02.14 |
영화감독 숌 백준 1436번 c++ (0) | 2022.02.14 |
랜선 자르기 백준 1652번 c++ (0) | 2022.02.14 |