본문 바로가기
PS/BOJ

[BOJ 1166] 선물

by Saerong2 2020. 4. 30.

 

 

 

 

문제 링크

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

 

1166번: 선물

첫째 줄에 N L W H가 주어진다. 모든 값은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net


아이디어

이분 탐색을 통해, L*W*H의 박스안에 A*A*A의 박스가 N개 이상 들어가도록하는 A의 최대값을 찾는다.

 


주의할 점

  • L, W, H는 최대 1e9이기 때문에 num의 최대값은 1e27라고 생각할 수 있다.
    이 때, 1e27은 8byte의 long long int로도 표현할 수 없는 큰 수이다.
    하지만 N=1e9일 때, mid의 최소값은 1e3이며 따라서 num의 최대값은 1e18로 long long int로 커버 가능하다.

 

  • 이분 탐색의 반복문을 while (hi - lo > eps) 로 할 경우,
    hi, lo의 자료형이 double이라면 IEEE 754의 한계 때문인지 무한루프에 빠지게 된다.
    따라서 long double로 해결하거나 아래와 같이 임의로 충분한 수의 반목문을 돌려주어 해결하자.

 


소스코드

#include <cstdio>
#include <algorithm>

using namespace std;

int n, a[3];
long long num;
double lo = 0, hi = 2e10, mid;

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < 3; ++i)
        scanf("%d", a + i);

    for (int i = 0; i < 30000; ++i) {
        num = 1;
        mid = (lo + hi) / 2;
        for (int i = 0; i < 3; ++i) {
            num *= (long long)(a[i] / mid);
        }
        if (num < n) {
            hi = mid;
        }
        else {
            lo = mid;
        }

    }
    printf("%.10lf\n", lo);
  	return 0;
}

 

 

 

 

공부한 것을 정리하기 위한 기록입니다.

상냥한 피드백은 감사히 받겠습니다.

'PS > BOJ' 카테고리의 다른 글

[BOJ 14503] 로봇청소기  (0) 2020.05.15
[BOJ 14499] 주사위 굴리기  (0) 2020.05.14
[BOJ 1421] 나무꾼 이다솜  (0) 2020.05.08
[BOJ 1411] 비슷한 단어  (0) 2020.05.07
[BOJ 1564] 팩토리얼5  (0) 2020.05.04

댓글