hwooo
BOJ (C/C++) 18111번: 마인크래프트 본문
https://www.acmicpc.net/problem/18111
18111번: 마인크래프트
팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게
www.acmicpc.net



풀이
처음엔 이분탐색으로 시도했는데, 게시판의 예제들을 돌리면서 어떤 조건으로 설정해도 모든 경우를 충족시킬 수 없음을 확인함.또 집터의 범위가 크지 않고, 수의 범위 또한 256으로 작은 편이라 완전 탐색으로 풂.
코드
#include <stdio.h>
int height[257];
int N, M, B;
void Find(int min, int max) {
int value = min - 1, high;
int plus, del, time = 1000000000;
// 집터의 모든 수를 탐색함
while (value <= max) {
value++;
plus = del = 0;
for (int i = min; i <= max; i++) {
if (value - i > 0) plus += (value - i)*height[i];
else del += (i - value)*height[i];
}
// 가지고 있는 블록 갯수보다 많을 때
if (plus > B + del) continue;
int t = del * 2 + plus;
if (t < time) time = t, high = value;
else if (t == time && high < value) high = value;
}
printf("%d %d", time, high);
}
int main() {
int max = -1, min = 300, n;
scanf("%d %d %d", &N, &M, &B);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &n);
height[n]++;
if (n < min) min = n;
if (n > max) max = n;
}
}
Find(min, max);
return 0;
}
'Study > Algorithm' 카테고리의 다른 글
| BOJ (C/C++) 1976번: 여행 가자 (0) | 2022.12.08 |
|---|---|
| BOJ (C/C++) 13549번: 숨바꼭질 3 (0) | 2022.12.08 |
| BOJ (C/C++) 10039번: 평균 점수 (0) | 2022.12.06 |
| BOJ (C/C++) 1654번: 랜선 자르기 (0) | 2022.12.05 |
| BOJ (C/C++) 15829번: Hashing (0) | 2022.12.05 |