Algorithm/BOJ
1654 랜선 자르기
henry1214
2018. 2. 12. 00:16
https://www.acmicpc.net/problem/1654
이분 탐색으로 정답의 범위를 줄여가면서 랜선의 최대 길이를 찾는다. 랜선의 개수가 모자라면 범위를 내리면서 개수를 늘려가고 랜선의 개수가 원하는 개수보다 같거나 크다면 범위를 최대한 올려가면서 랜선의 최대 길이를 찾는다. 이 때 mid가 정답이 되는 것이 아니라 매번 조건을 만족하는지 확인하면서 정답을 갱신해줘야 한다.
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 | #include <cstdio> long long k,n,ans,lc[10000],max; void bs() { long long left=1,right=max,mid; while(left<=right) { mid=(left+right)/2; long long sum=0; for(int i=0;i<k;i++) sum+=lc[i]/mid; if(sum<n) right=mid-1; else { if(ans<mid) ans=mid; left=mid+1; } } } int main() { scanf("%lld %lld",&k,&n); for(int i=0;i<k;i++) { scanf("%lld",&lc[i]); if(max<lc[i]) max=lc[i]; } bs(); printf("%lld\n",ans); return 0; } | cs |