득이공간

[백준 C++] 1654 랜선 자르기 - 이분탐색 본문

PS/알고리즘 문제풀이

[백준 C++] 1654 랜선 자르기 - 이분탐색

쟁득 2024. 1. 29. 10:44
 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

cpp
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> Lines; int main() { int K, N; ‌cin >> K >> N; ‌Lines.reserve(K); for (int i = 0; i < K; ++i) { ‌‌int Line; ‌‌cin >> Line; ‌‌Lines.emplace_back(Line); } int Result = 0; long long Length = 0; long long MinLength = 1; long long MaxLength = *max_element(Lines.begin(), Lines.end()); while (MinLength <= MaxLength) { ‌‌Length = (MinLength + MaxLength) / 2; ‌‌int Count = 0; ‌‌for (const int& Line : Lines) ‌‌{ ‌‌‌Count += Line / Length; ‌‌} ‌‌if (Count < N) ‌‌{ ‌‌‌MaxLength = Length - 1; ‌‌} ‌‌else ‌‌{ ‌‌‌Result = Length; ‌‌‌MinLength = Length + 1; ‌‌} } ‌cout << Result; }

 

이전에 풀이한 2805(나무 자르기) 문제와 풀이방식이 거의 유사합니다.

 

이번 문제에서는 랜선의 길이가 INT_MAX값까지 가능하므로

길이 탐색을 위한 변수의 자료형 선택에 주의가 필요합니다.