문제링크 : https://www.acmicpc.net/problem/1654
아이디어
- 랜선의 길이를 정한다음, K개의 랜선에 각각 나눠보면서 N개 이상이 되는 최대의 개수를 구하면됨
- 정답이 되는 랜선의 길이를 가지고 이진 탐색 수행
- 구하려는 랜선길이 이분탐색
- 이분탐색할때 K개에 대해서 나눠줌
- N개 이상이 되는 최대 길이를 구함 > upper bound
- 정답이 되는 랜선의 길이를 가지고 이진 탐색 수행
시간복잡도 계산
- 구하려는 랜선길이 이분탐색 : lg(2^31)
- 이분탐색할때 K개에 대해서 나눠줌 : O(K)
- O(lg(2^31) * K) = 31 * 1e4 = 3e5
인트 계산
- 이미 가지고 있는 랜선길이 : 1~2^31 = int 가능
- 자를수 있는 갯수 계산할때 :
- 제일 작은 1로 자른다고 쳤을때
- 최대값 : 2^31 * K >> long long 사용
코드
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 32 33 34 35 36 37 38 | #include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; int K,N; int nums[10010]; // ll cal(int mid) { ll rs=0; for(int i=0; i<K; i++) rs+=nums[i]/mid; return rs; } int binsearch(ll st, int en, int tar) { if(st==en) { return st; } int mid = (st+en+1)/2; if(cal(mid) >= tar) { return binsearch(mid, en, tar); } else return binsearch(st, mid-1, tar); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> K >> N; for(int i=0; i<K; i++) cin >> nums[i]; cout << binsearch(1,pow(2,31)-1, N) << '\n'; } | cs |
문제유형
- 이분탐새 - 케이스를 이분탐색
비슷한 문제
'알고리즘 > 백준' 카테고리의 다른 글
백준 4354 문자열 제곱 쉬운 풀이 (C++/CPP) (0) | 2021.03.03 |
---|---|
백준 4358 생태학 쉬운 풀이 (C++/CPP) (0) | 2021.02.28 |
백준 10815 숫자 카드 쉬운 풀이 (C++/CPP) (0) | 2021.02.21 |
백준 1965 상자넣기 쉬운 풀이 (C++/CPP) (0) | 2021.02.21 |
백준 1715 카드 정렬하기 (0) | 2021.02.21 |