ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1931
    백준 2021. 8. 3. 19:37
     

    1931번: 회의실 배정

    (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

    www.acmicpc.net

    문제

    • 회의시간이 $n(1\leq n \leq 10^{5})$개 주어질 때 최대로 진행할 수 있는 회의의 개수?

     

     

    $O(nlog\ n)$

    남은 회의 중 가장 빨리 끝나는 회의를 우선으로 배정한다

    위 알고리즘으로 선택한 회의를 $S$, 최적해를 $O$라 하자
    이때 각 집합은 회의가 빨리끝나는 순으로 indexing 되어있다
    $$\begin{align*}
    &S:= \left \{ p_{1},\ p_{2},\cdot \cdot \cdot, p_{k} \right \}\\
    &O:= \left \{ q_{1},\ q_{2},\cdot \cdot \cdot, q_{l} \right \}
    \end{align*}$$

    이때 어떤 최적해 알고리즘이 $q_{1},\ q_{2},\ ...$순으로 회의를 고른다고 가정하자

    $p$ 회의가 끝나는 시간을 $f(p)$로 표기하면

    Claim
    $$f(p_{i}) \leq f(q_{i}),\ i=1,\ 2,\ ...\ ,\ k,\ k = l$$


    $\because$
    i) i = 1 일때
    trivial

    ii) i 일때 준 명제가 성립한다고 가정


    (준 알고리즘에서 선택할 수 있는 회의) $\supset$ (최적해 알고리즘에서 선택할 수 있는 회의)
    따라서 최적해 알고리즘에서 선택할 수 있는 회의가 있다고 하면 그 회의는 준 알고리즘에서도 고를 수 있다
    또한 준 알고리즘은 진행할 수 있는 회의 중 가장 빨리 끝나는 회의를 고르므로 $f(p_{i+1}) \leq f(q_{i+1})$ □

     

    c++

    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
    #include <bits/stdc++.h>
    #define endl "\n"
    using namespace std;
     
    int n;
    priority_queue<pair<intint>vector<pair<intint> >, greater<> > meeting;
     
    int main()
    {
        cin >> n;
        int start, end;
        while(n--){
            cin >> start >> end;
            meeting.push({end, start});
        }
     
        int cnt = 1;
        auto fatest_end_time = meeting.top().first; meeting.pop();
        while(!meeting.empty()){
            auto cur = meeting.top(); meeting.pop();
            if(cur.second >= fatest_end_time){
                fatest_end_time = cur.first;
                cnt++;
            }
        }
     
        cout << cnt << endl;
     
     
        return 0;

     

    python

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import sys
    from heapq import *
     
    = int(sys.stdin.readline())
    = []
    for _ in range(n):
        s, e = map(int, sys.stdin.readline().split())
        h.append((e, s))
     
    heapify(h)
    e, _ = heappop(h)
    res = 1
    last = e
    while len(h):
        e, s = heappop(h)
        if s >= last:
            last = e
            res += 1
    print(res)cs

     

    참고

     

    탐욕 알고리즘 분석하기 (Correctness of Greedy Algorithms)

    탐욕 알고리즘(greedy algorithm)은 매번 현재로써 최선인 선택을 "탐욕스럽게" 취하는 알고리즘 기법으로, 문제 해결 및 다양한 분야에서 활용되고 있습니다. 알고리즘의 동작이 매우 단순하기 때문

    gazelle-and-cs.tistory.com

     

    '백준' 카테고리의 다른 글

    11047, Silver 2  (0) 2021.08.19
    18242, silver 5  (0) 2021.08.18
    16237, bronze 1  (0) 2021.08.16
    11000  (0) 2021.08.03
    14681  (0) 2021.04.16

    댓글

Designed by Tistory.