백준 1654. 랜선 자르기


조건
K개 랜선들을 같은 길이를 가진 N개의 랜선으로 절단
항상 자연수 길이로 잘리고
N개 초과도 N개 만든걸로 침
N개로 자르는 최대 길이 구하기

K ≦ N, 1<= K <= 10000, 1<= N <= 1000000
각 랜선의 길이는 int의 최대값 2^31 - 1 이하 자연수

생각
일단 입력된 랜선들의 길이를 쭉 저장해놓고
자르는 기준을 잡고 이분 탐색을 해 나가면
빠르게 최대 길이를 찾을 수 있을 것



#include <iostream>
#include <vector>
typedef unsigned int uint;

int bs(int k, int n, std::vector<int> &vec) {
 uint p = 0, q = 0x7FFFFFFF;
 while (p <= q) {
  int cnt = 0;
  uint cut_size = (p + q) / 2;
  for (int a : vec)
   cnt += a / cut_size;
  if (cnt < n) q = cut_size - 1;
  else p = cut_size + 1;
 }
 return q;
}

int main() {
 int k, n, t;
 std::vector<int> vec;

 scanf("%d %d", &k, &n);
 for (int i = 0; (i < k) && scanf("%d", &t); ++i)
  vec.push_back(t);

 printf("%d", bs(k, n, vec));
}



*유의할 것은 이분 탐색의 양 끝값이
탐색도중 int의 범위를 넘어 오버플로 날 수 있으므로
long long이나 unsigned int를 써줘야 정답이 나온다

다음 글 이전 글
댓글 쓰기
comment url