1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
이 문제는 주어진 랜선 K개의 길이를 잘라 같은 길이의 N개를 만들 때 최대 랜선의 길이를 구하는 문제입니다.
랜선의 길이가 INT_MAX 값보다 작거나 같은 자연수 이므로 Naive한 방법으로는 시간초과가 발생하므로 해결할 수 없습니다.
자를 수 있는 랜선 길이의 범위 내에서 가능한 최대 길이를 구하는 문제로 정렬된 순열에서 특정 값을 찾는 문제로 해석할 수 있고 이는 이분 탐색을 사용하면 O(KlgINT_MAX) 시간복잡도로 해결 할 수 있습니다. (현재 시도해볼 값 mid로 K개를 나눴을때 몫이 N개 이상인지 아닌지로 양 끝값을 조절하므로.)
#include <iostream>
#include <algorithm>
#include <vector>
#include <memory.h>
#include <deque>
using namespace std;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
ll k, n, arr[10001];
cin >> k >> n;
for (ll i = 0; i < k; i++) {
cin >> arr[i];
}
ll s = 1, e = 3e9;
ll mid;
ll ans = 0;
while(s<=e){
mid = (s + e) / 2;
ll cnt = 0;
for (ll i = 0; i < k; i++) {
cnt += (arr[i] / mid);
}
if (cnt >= n) {
ans = max(ans,mid);
s = mid + 1;
}
else {
e = mid - 1;
}
}
cout << ans;
}
유사한 문제로 2805번: 나무 자르기 가 있습니다.
반응형
'Solved.ac > Class 2' 카테고리의 다른 글
c++ sort 함수 커스텀, 특정 조건 정렬, 우선순위 큐 정렬 (0) | 2020.09.07 |
---|---|
[BOJ] 백준 9012번: 괄호 (0) | 2020.09.07 |
[BOJ] 백준 1929번: 소수 구하기, 에라토스테네스의 체 (0) | 2020.09.07 |