홍시홍의 프로그래밍

[백준 3020] 개똥벌레 본문

알고리즘 문제풀이/백준

[백준 3020] 개똥벌레

홍시홍 2020. 1. 14. 23:32

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

 

3020번: 개똥벌레

문제 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 번갈아가면서 등장한다. 아래 그림은 길이가 14미터이고 높이가 5미터인 동굴이다. (예제 그림) 이 개똥벌레는 장애물을 피하지 않는다. 자신이 지나갈 구간을 정한 다음 일직선으로 지나가면서 만나는 모든 장애물을 파괴한다. 위의 그림에서 4번째 구간으로 개똥벌레

www.acmicpc.net

요구사항

최소로 기둥을 부수는 높이 h와 이러한 높이의 개수 찾기

 

풀이

prefix sum이라는 개념을 활용하여

현재 높이의 기둥 부수는 수 = 현재 높이 기둥 + (현재 높이+1 기둥 들의 합)

을 이용하여 풀었다.

 

#include <iostream>

using namespace std;
int top[500002];
int bot[500002];
int topA[500002];
int botA[500002];
int main() {
	int n, h;
	cin >> n >> h;
	for (int i = 0; i < n; i++) {
		int x;
		scanf("%d", &x);
		if (i % 2 == 0)
			top[x]++;
		else
			bot[x]++;
	}
	for (int i = h; i >= 1; i--) {
		topA[i] = top[i] + topA[i + 1];
		botA[i] = bot[i] + botA[i + 1];
	}
	int ans = 987654321;
	int cnt = 0;
	for (int i = 1; i <=h ; i++) {
		int now = topA[i] + botA[h - i+1];
		if (ans > now) {
			ans = now;
			cnt = 1;
		}
		else if (ans == now) {
			cnt++;
		}
	}
	cout << ans << " " << cnt << endl;
}
Comments