알고리즘/BOJ

백준 16434번 드래곤 앤 던전

꾸준함. 2019. 2. 5. 01:39

문제 링크입니다: https://www.acmicpc.net/problem/16434


재미있는 이분 탐색 문제였습니다.


high를 LLONG_MAX로 두었다가 포션 방에서 hp를 계산할 때 오버플로우가 나서 틀렸던 문제였습니다.

이 부분만 조심한다면 다른 이분 탐색 문제와 유사합니다!


#include <iostream>

#include <algorithm>

#include <climits>

using namespace std;

 

const int MAX = 123456;

 

int N, H;

pair<int, pair<int, int>> room[MAX];

 

bool func(long long mid)

{

        long long hp = mid;

        long long atk = H;

 

        for (int i = 0; i < N; i++)

        {

                 if (room[i].first == 1)

                 {

                         //몬스터보다 먼저 죽을 경우

                         if (((room[i].second.second - 1) / atk) > ((hp - 1) / room[i].second.first))

                                 return false;

                         //몬스터 처치 시 드는 비용

                         hp -= (room[i].second.second - 1) / atk * room[i].second.first;

                 }

                 else

                 {

                         atk += room[i].second.first;

                         hp = min(hp + room[i].second.second, mid);

                 }

        }

        return true;

}

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

        cin >> N >> H;

 

        for (int i = 0; i < N; i++)

                 cin >> room[i].first >> room[i].second.first >> room[i].second.second;

 

        //LLONG_MAX로 둘 경우 overflow 발생

        long long low = 1, high = 1e18;

        long long result = -1;

        while (low <= high)

        {

                 long long mid = (low + high) / 2;

 

                 if (func(mid))

                 {

                         result = mid;

                         high = mid - 1;

                 }

                 else

                         low = mid + 1;

        }

        cout << result << "\n";

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1158번 조세퍼스 문제  (0) 2019.02.05
백준 3012번 올바른 괄호 문자열  (0) 2019.02.05
백준 15732번 도토리 숨기기  (0) 2019.02.04
백준 5425번 자리합  (0) 2019.02.04
백준 6236번 용돈 관리  (0) 2019.02.04