변명은 만개 결과는 한개

[이분 탐색 01] 본문

공부/Problem Solving

[이분 탐색 01]

노마십가 2020. 7. 1. 01:18
728x90
반응형
더보기
#include <stdio.h>
using namespace std;

int A, B, V;
int minn = 1000;
int ansDay = 0;
int dayHeight(int day){
	int yesterdayHeight = (A - B) * (day - 1);
	int todayHeight = yesterdayHeight + A;
	// int tomorrowHeight = tdayHeight - B;
	return todayHeight;
}

int main()
{
	scanf_s("%d %d %d", &A, &B, &V);
	int right = V + 1;	// <쌉가능>
	int left = 0;	// <불가능>
	//printf("left,right : %d,%d\n", left, right);

	int result = right;
	
	while (left <= right) {
		int mid = (left + right) / 2;
		int dailyMax = dayHeight(mid);
		//printf("mid:%d , dM:%d\n", mid, dailyMax);
		if (dailyMax >= V) {
			result = result < mid ? result : mid;
			right = mid - 1;
		}
		else if (dailyMax < V) {
			left = mid + 1;
		}
	}
	printf("%d", result);
}

 

평소 사용하는 분할정복이랑 개념이 같음.

 

1. log(n) 이라 슈퍼빠르다.

2. 초기 left, right 잡을땐 최악, 최고일 경우의 수를 적는게 맞다.

3. left == mid 는 서칭이 끝났다는거지, best case 를 찾았다는게 아님.

4. 딱뎀일때 break 고려해도될것같은데?

 

팁 > 이분탐색 쓰려면 위에 식 그냥 외우고,

문제마다 이분탐색 적용할 각을 잘재(습득하)면 됨

728x90
반응형

'공부 > Problem Solving' 카테고리의 다른 글

[백준 11866] 요세푸스 문제 0 (java)  (0) 2022.05.03
[백준 11650] 좌표 정렬하기 (java)  (0) 2022.05.03
[DFS, BFS 01]  (0) 2020.06.26
[다이나믹 프로그래밍 01]  (0) 2020.06.25
[백준 2231] 분해합  (2) 2019.11.04