생각이 담아두는 곳

이분탐색(백준 15732번) 본문

CS/Algorithm

이분탐색(백준 15732번)

Chang_Tree 2020. 3. 11. 01:28

백준 15732번

내 코드 

//
//  main.cpp
//  15732
//
//  Created by CFox on 2020/03/10.
//  Copyright © 2020 CFox. All rights reserved.
//

#include <iostream>
#include <algorithm>

using namespace std;

int main(int argc, const char * argv[]) {
    int box, rule, dotori;
    int rule_box[10001][3];
    scanf("%d %d %d",&box,&rule,&dotori);
    for(int i=0;i<rule;i++){
        scanf("%d %d %d",&rule_box[i][0],&rule_box[i][1],&rule_box[i][2]);
    }
    
    int lo = 0;
    int hi = 1000001;
    
    while(lo+1<hi){
        int mid = (lo+hi)/2;
        long long count = 0;
        for(int i=0;i<rule;i++){
            if(rule_box[i][0]<=mid) count += ((min(rule_box[i][1],mid) - rule_box[i][0])/rule_box[i][2] + 1);
        }
        if(count>=dotori) hi = mid;
        else lo = mid;
        
    }
    printf("%d",hi);
}

d처음에 rule_box[i][1]과 mid 중 최소를 잡아주는 것을 못하고 계속 틀렸다. 생각해보면 당연한데, 기준을 잡고 그 기준보다 아래에 있는 박스들에 들어간 도토리 갯수를 구하는건데, 예를 들면 

규칙이 100번 상자부터 150상자까지 10번째씩 도토리를 넣는다고 생각하면, 내가 잡은 기준이 120번이라고 했을 때, 130과 140과 150은 카운트를 하지 않기 때문이다. ㅇㅅㅇ 

아무튼 이 착오 때문에 여러 번 틀렸다. 

'CS > Algorithm' 카테고리의 다른 글

이분탐색(백준 1300번)  (0) 2020.03.16
이분탐색(백준 6236번, 1654번, 2110번)  (0) 2020.03.04
이분 탐색(백준 2512번과 2343번)  (1) 2020.03.04
Comments