개똥벌레
문제
개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 번갈아가면서 등장한다.
아래 그림은 길이가 14미터이고 높이가 5미터인 동굴이다. (예제 그림)
이 개똥벌레는 장애물을 피하지 않는다. 자신이 지나갈 구간을 정한 다음 일직선으로 지나가면서 만나는 모든 장애물을 파괴한다.
위의 그림에서 4번째 구간으로 개똥벌레가 날아간다면 파괴해야하는 장애물의 수는 총 여덟개이다. (4번째 구간은 길이가 3인 석순과 길이가 4인 석순의 중간지점을 말한다)
하지만, 첫 번째 구간이나 다섯 번째 구간으로 날아간다면 개똥벌레는 장애물 일곱개만 파괴하면 된다.
동굴의 크기와 높이, 모든 장애물의 크기가 주어진다. 이때, 개똥벌레가 파괴해야하는 장애물의 최솟값과 그러한 구간이 총 몇 개 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 H가 주어진다. N은 항상 짝수이다. (2 ≤ N ≤ 200,000, 2 ≤ H ≤ 500,000)
다음 N개 줄에는 장애물의 크기가 순서대로 주어진다. 장애물의 크기는 H보다 작은 양수이다.
출력
첫째 줄에 개똥벌레가 파괴해야 하는 장애물의 최솟값과 그러한 구간의 수를 공백으로 구분하여 출력한다.
예제 입력
6 7
1
5
3
3
5
1
예제 출력
2 3
풀이
아래서부터 자라는 석순(초록색) 위에서부터 자라는 종유석(파란색)이 있다.
높이 1일때 파괴해야하는 석순 : 2+1+4 = 7 높이 2일때 파괴해야하는 석순 : 1+4 = 5 높이 3일때 파괴해야하는 석순 : 4 높이 4일때 파괴해야하는 석순 : 4 높이 5일때 파괴해야하는 석순 : 0 |
높이 1일때 파괴해야하는 종유석 : 0 높이 2일때 파괴해야하는 종유석 : 0 높이 3일때 파괴해야하는 종유석 : 5 높이 4일때 파괴해야하는 종유석 : 7 높이 5일때 파괴해야하는 종유석 : 10 |
석순과 종유석의 높이별 누적합을 구하고 합쳐준다.
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int width, heigth, temp;
int *up, *down;
unsigned int *sum;
cin >> width >> heigth;
up = new int[heigth]{0,};
down = new int[heigth]{0,};
sum = new unsigned int[heigth]{0, };
for(int i = 0; i < width; i++){
cin >> temp;
if(i % 2 == 0){
up[temp-1]++;
}else{
down[temp-1]++;
}
}
for(int i = 1; i < heigth; i++){
up[heigth-i-1] += up[heigth-i];
down[heigth-i-1] += down[heigth-i];
}
for(int i = 0; i < heigth; i++)sum[i] = up[i] + down[heigth-1-i];
sort(sum, sum+heigth);
int count = 1;
for(int i = 0; sum[i] == sum[i+1]; i++)count++;
cout << sum[0] << " " << count;
}
'알고리듬 > 문제' 카테고리의 다른 글
[baekjoon] 16118 (0) | 2023.04.28 |
---|---|
[baekjoon] 2212 (0) | 2023.04.27 |
[baekjoon] 1937 (0) | 2023.04.27 |
[baekjoon] 2470 (0) | 2023.04.26 |
[baekjoon] 23354 (0) | 2023.04.24 |