알고리즘 문제
[C/C++ 백준 3020번] 개똥벌레 (Gold 5)
새파란 공대생
2020. 8. 23. 22:06
https://www.acmicpc.net/problem/3020
3020번: 개똥벌레
문제 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석��
www.acmicpc.net
막상 푸려면 되게 번거로운 문제. 이분 탐색에만 초점을 두다가 모르겠어서 냅뒀는데, 일단 모든 칸의 장애물 개수를 계산해도 시간초과가 나질 않는다.
그래서 기본 구조는 모든 칸을 계산 ==> 가장 적은 칸들의 개수랑 장애물이 몇 개인지 세주기이다.
기본적으로 정렬을 이용하고, algorithm에서 제공하는 lower_bound, upper_bound 를 이용했다.
#include <cstdio>
#include <algorithm>
using namespace std;
int down[500001]={}, up[500001]={}, total[500001]={};
int main(void){
int N, H, a, b;
scanf("%d %d", &N, &H);
for(int i=0; i<N/2; i++){
scanf("%d %d", &a, &b);
down[a]++;
up[b]++;
}
for(int i=H; i>1; i--){
down[i-1] += down[i];
up[i-1] += up[i];
}
for(int i=1; i<=H; i++)
down[i] += up[H-i+1];
sort(down, down+H+1);
int lower = lower_bound(down+1, down+H+1, down[1]) - (down+1) + 1;
int upper = upper_bound(down+1, down+H+1, down[1]) - (down+1) + 1;
printf("%d %d",down[1], upper - lower);
}