GitHubSeob

C++ / 백준 / 3020 / 개똥벌레 본문

Baekjoon/Gold

C++ / 백준 / 3020 / 개똥벌레

GitHubSeob 2024. 3. 28.
문제

 

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

 

3020번: 개똥벌레

개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이

www.acmicpc.net

 

 

문제풀이

 

계속 시도해 보다가 안 돼서 누적합이라는 분류를 보고 풀었다.

석순과 종유석을 구분해서 1부터 N까지 홀수 부분은 홀수 벡터에, 짝수 부분은 짝수 벡터에 따로 저장한다.

(인덱스는 길이)

 

위 그림(예제2)에서는 홀수 벡터는 {1, 1, 4, 1, 0}, 짝수 벡터는 {0, 2, 3, 2, 0}이 된다.

장애물의 높이가 2이면 높이가 1인 위치에서 닿으므로 누적합을 한다.

홀수 벡터는 높은 위치 부터 낮은 순으로 더한다. {7, 6, 5, 1, 0}

짝수 벡터도 높은(길이가 긴) 위치부터 낮은 순(길이가 짧은)으로 더한다. {7, 7, 5, 2, 0}

높이가 1인 위치에서는 석순의 높이는 1, 종유석의 높이가 5가 돼야 개똥벌레랑 닿으므로 홀수[1]+짝수[5], 홀수[2]+짝수[4], ... 이런 식으로 값을 저장하는 벡터를 만든다.

그러면 {7, 8, 10, 8, 7}이 된다.

이를 정렬 한뒤 upper_bound를 이용해 최솟값의 개수를 구한다.

 

 

코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int N(0), H(0);
	cin >> N >> H;

	vector<int>odd(H + 1, 0);
	vector<int>even(H + 1, 0);

	int height(0);
	for (int idx = 1; idx <= N; ++idx) {
		cin >> height;
		if (idx % 2 == 1) ++odd[height];
		else if (idx % 2 == 0) ++even[height];
	}
	for (height = H - 1; height >= 1; --height) {
		odd[height] += odd[height + 1];
		even[height] += even[height + 1];
	}

	vector<int>obstacle(H + 1, 0);
	for (height = 1; height <= H; ++height) {
		obstacle[height] = odd[height] + even[H - height + 1];
	}

	sort(obstacle.begin(), obstacle.end());
	int right = upper_bound(obstacle.begin() + 1, obstacle.end(), obstacle[1]) - obstacle.begin();
	cout << obstacle[1] << " " << right - 1;
}

 

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 5052 / 전화번호 목록  (0) 2024.04.04
C++ / 백준 / 6156 / Cow Contest  (0) 2024.04.04
C++ / 백준 / 1245 / 농장 관리  (0) 2023.10.15
C++ / 백준 / 13422 / 도둑  (0) 2023.10.06
C++ / 백준 / 14891 / 톱니바퀴  (1) 2023.10.04