728x90
https://www.acmicpc.net/problem/18111
문제 풀이
기본적인 브루트 포스 문제이다.
기준이 되는 높이에서 걸리는 시간을 구해서 계속 비교해 가장 작은 값을 출력하면 된다.
입력받을 때 최소 높이와 최대 높이를 구해 놈으로 반복 횟수를 최소화할 수 있다.
최소가 되는 시간이 여러 경우가 있을 수 있어 그 중 가장 높은 높이일 때를 출력해야 한다.
(제거 시간 + 쌓는 시간)이 최소 시간과 같을 때도 최신화 함으로 가장 높은 높이를 출력할 수 있다!
느낀 점
그렇게 난이도가 높지 않은 구현 문제인데 너무나 어려웠다. 구현 부분에 있어서 아직 실력이 너무 부족한 것 같다.
다시 열심히 코딩을 해야 할 것 같다.
코드
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
int n, m, block;
int high = -1, low = INT_MAX;
int map[501][501];
int highest = -1, time = INT_MAX;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> block;
for (int i = 0; i < n;i++) {
for (int j = 0; j < m;j++) {
cin >> map[i][j];
high = max(high, map[i][j]);
low = min(low, map[i][j]);
}
}
for (int h = low; h <= high; h++) {
int build = 0, remove = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m;j++) {
int tmp = map[i][j] - h;
if (tmp > 0) remove += tmp;
else if (tmp < 0) build -= tmp;
}
}
if (remove + block >= build) {
if (time >= remove * 2 + build) {
time = remove * 2 + build;
highest = h;
}
}
}
cout << time << " " << highest;
}
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[C++] 백준 1158번 : 요세푸스 문제 (0) | 2021.09.24 |
---|---|
[C++] 백준 16236번 : 아기 상어 (0) | 2021.09.15 |
[C++] 백준 2805번 : 나무 자르기 (0) | 2021.08.05 |
[C++] 백준 1654번 : 랜선 자르기 (0) | 2021.08.05 |
[C++] 백준 10816번 : 숫자 카드 2 (0) | 2021.08.05 |
댓글