[백준] 16401 C++

윤경·2021년 6월 23일
0

Baekjoon

목록 보기
45/64

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 과자 나눠주기

int arr[1000001];
int M, N;         // M: 조카 N: 과자
int len = 0;      // 과자 길이

// bool desc(int a, int b) {
//   return a > b;
// }

bool check(int a) {
  int cnt = 0;  // 몇명에게 나눠줄 수 있는지
  int temp;     // 과자 길이

  for(int i=N-1; i>=0; i--) {
    if(len > arr[i]) { break; }     // 확인할 과자 길이가 가진 과자보다 길면 나눠줄 수 없음
    temp = arr[i];
    while(temp >= a) {              // 과자를 자를 수 있을만큼 자르기
      cnt++;                        // 자른 과자가 몇개 나오는지
      temp -= a;                    // 과자를 자르면서 과자의 길이가 줄어듦
    }
    if(cnt >= M) { return true; }   // 과자 수가 아이의 수보다 많으면
  }
  if(cnt >= M) { return true; }
  else { return false; }            // 과자 수가 아이의 수보다 적으면
}

void search(int left, int right) {
  if(left > right) { return; }

  int mid = (left+right) / 2;

  if(check(mid)) {                 // 나누어줄 수 있는 과자 길이라면
    if(len < mid) { len = mid; }
    search(mid+1, right);
  } else {
    search(left, mid-1);
  }
}

int main() {
  ios::sync_with_stdio(0);

  cin >> M >> N;
  for(int i=0; i<N; i++) {
    cin >> arr[i];
  }
  sort(arr, arr+N);

  search(1, arr[N-1]);

  cout << len << '\n';



  return 0;
}

이분탐색 낯설다,,
문제를 더 많이 풀어봐야겠다.

profile
개발 바보 이사 중

0개의 댓글