공부/Algorithm

Binary search

Egomi 2018. 7. 9. 22:04
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
첫 번째 줄에는 마을 수 N(1≤N≤100,000, 정수)이 입력된다
두 번째 줄부터 N줄에 걸쳐 마을 정보가 입력된다. 마을 정보는 두 개의 정수A, B이며 공백으로 구분되어 입력된다. A는 도시의 위치이며 B는 잡힌 물고기 양이다. (1≤A≤1,000,000,000, 단위는 km) (0≤B≤1,000,000,000, 단위는 톤)
마을 정보는 도로 위치에 따라 오름차순으로 정렬되어 입력된다.
*/
 
#include <stdio.h>
#define _CRT_NO_SECURE_WARNINGS
#define MAX 100000
 
int N = 0, maps[2][MAX + 1];
 
int isEnough(long long m) {
    int i;
    long long next=0, tax;
 
    // 남는 양을 이웃 마을에 넘겨주기
    // 만약, 거리가 너무 넓어서 넘겨줄 수 없는 경우 이웃에게 줄 수 있는 양은 0개
    for (i = 0; i < N - 1; i++) {
        long long sum = maps[1][i] + next - m; // 현재 마을의 물고기 양
        long long tax = maps[0][i + 1] - maps[0][i];
        if (sum>=0) {
            if (sum - tax>=0)
                next = sum - tax;
            else next = 0;
        }
        else
            next = sum - tax;
    }
    if (maps[1][N-1]+next>= m) return 1;
    else return 0;
}
 
long long binary_upper_search(long long s, long long e) {
    long long m, sol;
    while(s<=e){
         m = (s + e) / 2;
        // 모든 마을에 m명의 아이들을 배정하고도 생선이 남는 경우
        // 상한을 구해야 하므로 배정할 아이들의 수를 구한다.
        if (isEnough(m)) {
            sol = m;
            s = m + 1;
        }
        // 아이들에게 생선을 나눠줄 수 없으면 배정할 아이들을 줄인다.
        else e = m - 1;
    }
    return sol;
}
 
int main(void) {
    //freopen("input.txt", "r", stdin);
    scanf("%d", &N);
    int i;
    long long max_fish = 0;
    for (i = 0; i < N; i++) {
        scanf("%d", &maps[0][i]);
        scanf("%d", &maps[1][i]);
        if (max_fish < maps[1][i]) max_fish = maps[1][i];
    }
     
    printf("%lld", binary_upper_search(0, max_fish));
    return 0;
}
 
 
/**************************************************************
    Problem: 2740
    User: AXQ6548
    Language: C
    Result: Accepted
    Time:47 ms
    Memory:1864 kb
****************************************************************/


'공부 > Algorithm' 카테고리의 다른 글

Heap으로 구현한 Priority Queue  (0) 2018.07.09
Segment Tree -구간 합  (1) 2018.07.09
MergeSort  (0) 2018.07.09
Heap Sort  (1) 2018.07.09
[BFS] 완전탐색하여 최단 비용 구하기 - 자외선 차단하기  (0) 2018.05.07