홍시홍의 프로그래밍

[백준 2805] 나무 자르기 본문

알고리즘 문제풀이/백준

[백준 2805] 나무 자르기

홍시홍 2020. 1. 8. 23:56

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기을 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따

www.acmicpc.net

 

요구사항

1. 적어도 원하는 나무 길이를 가져가기 위한 최소 나무 길이

 

풀이

1.  이분 탐색으로 찾기

적어도 m만큼만 가져갈 수 있다면 정답 가능성이 있는거임

정확히 m을 가져가는것이 아님

 

 

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

typedef long long ll;

ll n, m;
ll map[1000001];
ll tans = 0;
ll maxv = 0;
ll minv = 0;
bool check(ll k) {
	ll ans = 0;
	for (int i = 0; i < n; i++) {
		if (map[i] - k > 0) {
			ans += (map[i] - k);
		}
		if (ans >= m)
			return true;
	}
	if (ans >= m)
	{
		return true;
	}
	else {
		return false;
	}
}
ll Find() {
	ll left = minv;
	ll right = maxv;
	ll mid = 0;
	int cnt = 0;
	//cout << "M" << maxv << " minv" << minv << endl;
	while (left <= right) {
		mid = (left + right) / 2;
		if (check(mid)) {
			left = mid + 1;
			tans = max(tans, mid);
		}
		else {
			right = mid - 1;
		}
	}
	return tans;
}

int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		scanf("%lld", &map[i]);
		if (maxv < map[i])
			maxv = map[i];
	}
	cout << Find() << endl;




}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 10775] 공항  (0) 2020.01.09
[백준 10815] 숫자 카드  (0) 2020.01.09
[백준 1920] 수 찾기 (해시, 정렬)  (2) 2020.01.08
[백준 1976] 여행 가자  (0) 2020.01.02
[백준 1717] 집합의 표현  (0) 2020.01.02
Comments