본문 바로가기

알고리즘 문제

[C/C++ 백준 1654번] 랜선 자르기 (Silver 3)

www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

평범한 이분탐색 문제이다.

long long int와 N보다 같거나 큰 조건을 주의하자.

 

#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
	long long int K, N, answer, maxi = -1;
	scanf("%lld %lld", &K, &N);
	long long int wire[K];
	for(int i=0; i<K; i++){
		scanf("%lld", &wire[i]);
		maxi = max(wire[i], maxi);
	}
	long long int left = 1, right =maxi, mid;
	while(left<=right){
		int ans = 0;
		mid = (left +right)/2;
		for(int i=0; i<K; i++)
			ans += wire[i]/mid;
		if(ans >= N){
			answer = mid;
			left = mid +1;
		}
		else
			right = mid - 1;
	}
	printf("%lld", answer);
}