연습

분명 정렬 안 되어 있는 거 같은데 이분 탐색 써야할 때(백준 31848)

onaeonae1 2024. 8. 29. 21:20

문제부터 빠르게 살펴보자

 

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

 

도토리가 빠지는 구멍들이 정렬이 안 되어 있어 이분 탐색에 어려워보인다.

 

하지만 시뮬레이션을 생각해보면, 어차피 큰 구멍 사이에 있는 작은 구멍은 의미가 없다.

 

이런 경우에는 기존에 더 큰 값으로 덮어씌워도 된다. 그러면 최대값을 갱신해가며 기록하면 된다.

 

즉 오름차순으로 배열이 생겨나게 된다. 여기서 lower_bound 를 깔끔하게 써주면 문제를 해결할 수 있다.

 

코드

#include<iostream>
#include<vector>
using namespace std;
int N, M;
vector<int> minHoles;
int main() {
	cin.tie(0);
	cin.sync_with_stdio(false);
	cin >> N;
	int maxV = 0;
	for (int i = 0; i < N; i++) {
		int temp;
		cin >> temp;
		temp += i;
		maxV = (maxV < temp) ? temp : maxV;
		minHoles.push_back(maxV);
	}
	cin >> M;
	for (int i = 0; i < M; i++) {
		int temp;
		cin >> temp;
		int t = lower_bound(minHoles.begin(), minHoles.end(), temp) - minHoles.begin();
		t++;
		cout << t << " ";
	}

	return 0;
}