본문 바로가기

백준 온라인 저지

18111번: 마인크래프트

https://www.acmicpc.net/problem/18111

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net

1. 문제 분석

이 문제의 시간제한은 1초이고 N, M의 최댓값은 500, 500 높이의 범위는 0~256 이를 계산하면 257*500*500=64,250,000이다. 코드를 조금만 추가해도 1초가 넘어버리기 때문에 무식하게 풀면 안된다.

2. 코드 작성

#include <iostream>
#include <algorithm>
using namespace std;
int height[257];
pair<int, int> p_list[257];

bool comp(pair<int, int>& a, pair<int, int>& b)
{
	if (a.first == b.first) return a.second > b.second;//오름차순
	return a.first < b.first;//내림차순
	
}
int main()
{
	int M, N, B, cnt = 0;
	cin >> M >> N >> B;
	int num, max_num = -1;
	for (int i = 0;i < M;i++)
	{
		for (int j = 0;j < N;j++)
		{
			cin >> num;
			height[num]++;
			max_num = max(max_num, num);
		}
	}
	int sum_time = 0, sum_block = B;
	//0까지 다 깎음
	for (int i = 1;i <=max_num;i++)
	{
		if (height[i] != 0)
		{
			sum_time = sum_time + i * height[i] * 2;
			sum_block = sum_block + i * height[i];
		}
	}
	pair<int, int> p;
	p = { sum_time,0 };
	p_list[cnt++] = p;
	for (int i = 1;i <= max_num;i++)
	{
		for (int j = 0;j < i;j++) 
		{
			if (height[j] != 0)
			{
				sum_time = sum_time + height[j];
				sum_block = sum_block - height[j];
			}
		}
		for (int j = i;j <= max_num;j++)
		{
			if (height[j] != 0)
			{
				sum_time = sum_time - height[j] * 2;
				sum_block = sum_block - height[j];
			}
		}
		if (sum_block >= 0)
		{
			p = { sum_time,i };
			p_list[cnt++] = p;
		}
	}
	sort(p_list, p_list + cnt, comp);
	cout << p_list[0].first << " " << p_list[0].second;
	return 0;
}

3. 설명

그래서 나는 0~256에 집중했다.

 

'백준 온라인 저지' 카테고리의 다른 글

11000번: 강의실 배정  (0) 2021.09.09
2676번: 라스칼 삼각형  (0) 2021.09.01
1188번: 음식 평론가  (0) 2021.09.01
10026번: 적록색약  (0) 2021.09.01