[BOJ 1114] 통나무 자르기

2023. 5. 11. 16:04Baekjoon

728x90

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

 

1114번: 통나무 자르기

첫째 줄에 두 개의 수를 출력한다. 첫 번째 수는 가장 긴 조각의 길이이고, 두 번째 수는 그 때 처음 자르는 위치를 출력한다. 만약 가능한 것이 여러 가지라면, 처음 자르는 위치가 작은 것을 출

www.acmicpc.net

 

- 문제 요약

 

벌목꾼 백은진은 나무를 종이 공장에 옮겨야 한다. 하지만, 통나무의 길이가 너무 길어서 트럭에 들어가지 않으므로, 여러 개의 조각으로 나누려고 한다.

통나무의 길이는 L이고, K개의 위치에서만 자를 수 있다. 통나무를 자를 수 있는 위치가 주어진다. 이 위치는 통나무의 가장 왼쪽에서부터 떨어진 거리이다. 통나무를 자를 수 있는 횟수는 최대 C번이다.

통나무의 가장 긴 조각을 작게 만들고, 그 길이를 구해보자.

 

 

- 알고리즘 정리

 

전체 통나무의 길이가 L이라고 했으니, 단순히 오른쪽부터 시작해서 목표 길이에 가장 가깝게 잘라주면 됩니다.

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 10001
int l,k,c,arr[MAX];

int f(int w){
    int tmp=0,from=l,cc=c;
    for(int i=k-1;i>=0&&cc>0;i--){ 
        if(from-arr[i]>w){
            if(arr[i+1]-arr[i]>w){
                return -1;
            }
            cc--;
            from=arr[i+1];
        }
    }
    if(cc>0){
        from=arr[0];
    }

    if(from>w){
        return -1;
    }
    else{
        return from;
    }
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>l>>k>>c;
	for(int i=0;i<k;i++){
		cin>>arr[i];
	}
	sort(arr,arr+k);
	arr[k]=-1;
	int w=0,start=l/(c+1),end=l,mid,result;
	for(int i=0;i<k;i++){
        arr[w]=arr[i];
        if(arr[i]!=arr[i+1]){
        	w++;
		}
	}
	k=w;
	arr[k]=l;
	while(start<end){
        mid=(start+end)/2;
        result=f(mid);
        if(result>=1){
        	end=mid;
		}
		else{
			start=mid+1;
		}
	}
	cout<<start<<" "<<f(start)<<'\n';
}

코드 제출 결과

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 15998] 카카오머니  (0) 2023.05.12
[BOJ 13710] XOR 합 3  (0) 2023.05.11
[BOJ 16409] Coprime Integers  (0) 2023.05.11
[BOJ 18436] 수열과 쿼리 37  (0) 2023.05.09
[BOJ 11985] 오렌지 출하  (0) 2023.05.07