반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 1654 랜선 자르기 본문

백준(Baekjoon) 문제

백준 1654 랜선 자르기

huiung 2019. 2. 24. 21:03
반응형

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

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 k개의 랜선을 보유하고 있을 때 랜선을 잘라 N개의 개수의 랜선을 만들 때 모두 동일한 길이로 만드는데 가장 길게 할 수 있는 길이를 구하는 문제입니다. 주어진 k개 10000까지 가능하고 N이 10000000 까지 가능하므로 어떤값으로 모든 k를 나눠서 그합을 더했을 때 N이 되는지 일일이 확인한다면 시간이 많이 걸리게 될것입니다.

 

따라서 이분탐색을 이용하여 가장큰 값을 찾아내면 됩니다. 주의할 점은 랜선의 길이가 2^31-1까지 가능한데 중간에 두 랜선 사이의 연산이 있을 수 있어서 오버플로우 가능성이 있는 변수들은 long long으로 선언을 해주어야 합니다.

 

다음은 코드입니다.

 

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

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int N,K;
	cin >> K >> N;
	int arr[K];
	int result;
	long long max = 0;
	long long left = 0;
	long long right = pow(2, 31) - 1;
	long long mid;
	for(int i = 0; i < K; i++) {
		cin >> arr[i];
	}
	
	while(left <= right) {
		mid = (left+right)/2;
		result = 0;
		for(int j = 0; j < K; j++)
				result = result + arr[j] / mid;
			
			if(result >= N) {
				left = mid+1;
				if(mid > max)
					max = mid;
				}			
			else if(result < N){
				right = mid-1;
		}
	}
	cout<<max;
	
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 10815 숫자카드  (0) 2019.02.24
백준 1920 수 찾기  (0) 2019.02.24
백준 2579 계단 오르기  (0) 2019.02.22
백준 1149 RGB 거리  (0) 2019.02.22
백준 1932 정수 삼각형  (0) 2019.02.22