BOJ 2792 - 보석 상자

image.png

이게 뭐지하게 만드는 이분 탐색 문제이다.

문제를 잘 읽고 해석해야 한다.

아무도 못받는 아이가 있어도 되므로

$f(M)=$ $M$ 개씩 나눠줄 때 생기는 그룹이 $N$ 이하인가? 를 만족하는 가장 작은 $M$ 을 찾아주면 된다.

계속 작아질수록 그룹이 더 많이생겨서 아이보다 많아지기 때문이다.

void solve() {  
   int n, m;  
   cin >> n >> m;  
   vi a(m);  
   fv(a);  
  
   int L = 1, R = maxe(a), A = -1;  
   while (L <= R) {  
      int M = L + R >> 1;  
      int cnt = 0;  
      for (int i = 0; i < m; i++) {  
         cnt += a[i] / M;  
         if (a[i] % M) cnt++;  
      }  
      if (cnt <= n) {  
         R = M - 1;  
         A = M;  
      } else L = M + 1;  
   }  
   cout << A;  
}

Tags:

Categories:

Updated:

Comments