득이공간

[백준 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

#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값까지 가능하므로

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