PS

[C++] 1654 : 랜선 자르기

왕방토 2021. 1. 28. 18:17
728x90

실버Ⅲ

 

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

//2805 나무자르기 문제와 유사
int main() {

	int k, n;
	scanf("%d%d", &k, &n);
	vector <long long> v;

	long long tmp;
	for (int i = 0; i < k; i++) {
		scanf("%lld", &tmp);
		v.push_back(tmp);
	}

	sort(v.begin(), v.end());

	long long gaesoo;
	long long max_l = 1;

	long long low = 1;
	long long mid;
	long long high = v.back();

	//이분탐색으로 찾는것은 인덱스가 아닌 max_l값
	while (low <= high) {
		mid = (low + high) / 2;
		gaesoo = 0;
		for (int i = 0; i < k; i++) {
			gaesoo += v.at(i) / mid;
		}
		if (gaesoo >= n) {
			if (mid > max_l)
				max_l = mid;
			low = mid + 1;
		}
		else
			high = mid - 1;
	}
	printf("%lld", max_l);
}

 

이분 탐색의 원형은 선형 컨테이너에 해당 원소(target)가 있는지의 여부를 찾는 것이지만

이렇게 응용해서 조건을 만족하는 원소 x를 찾는 방법으로도 사용할 수 있다

 

이분 탐색의 응용이지만 이 로직은 많이 쓰이니까 머릿속에 꼭 입력해놔야 함

--------------------------------------------------------------------------------------------

2022.01.06 (SDS 중...)

 

이게 parametric search 구나..

다른 걸 알고있었네