ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2512] 예산
    백준/이분탐색 2023. 7. 1. 15:59

    배정가능한 예산 중 최대값을 찾는 것이므로 이분탐색으로 해결 가능

     

    이분탐색하는 binarysearch함수는 left<=right 를 만족하면 계속 돈다

     

    즉 마지막으로 while문을 도는게 left==right 일때이고 이 이후에는 무조건 left > right이 된다

     

    그림을 그려보면

     


     

    #include <iostream>
    #include <algorithm>
    #define SIZE 10000
    
    using namespace std;
    
    int arr[SIZE];
    int N,M;
    
    // 이 함수는 최적의 최대값을 찾기 위해 동작함
    // 즉 left <= right 일때 계속 돌아가서 
    // left==right일때 끝남
    // 근데 left==right일때 만족을 할 수도 있고 안할 수도 있음
    // 그래서 그 전 값을 계속 저장해놔야함
    
    int binarysearch(int left, int right) {
    	int prev = 0;
    	
    	while (left <= right) {
    		int mid = (left + right) / 2;
    		int sum = 0;
    
    		for (int i = 0; i < N; i++) {
    			if (arr[i] > mid) sum += mid;
    			else sum += arr[i];
    		}
    
    		// sum값 줄이기
    		if (sum > M) { right = mid - 1;}
    		// sum값 늘리기
    		else if (sum < M) { left = mid + 1; prev = mid; }
    		else { prev = mid; break; }
    	}
    	return prev;
    }
    
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	cin >> N;
    	int max = 0;
    	
    	for (int i = 0; i < N; i++) {
    		cin >> arr[i];
    		if (arr[i] > max) max = arr[i];
    	}
    	cin >> M;
    
    	cout << binarysearch(0, max);
    	return 0;
    }

    '백준 > 이분탐색' 카테고리의 다른 글

    [백준 28357] 사탕 나눠주기  (1) 2024.01.10
    [백준 16401] 과자 나눠주기  (1) 2023.09.12
    [백준 2805] 나무 자르기  (0) 2023.05.17
    [백준 1654] 랜선 자르기  (0) 2023.05.11