-
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
문제
- 회의시간이 n(1≤n≤105)개 주어질 때 최대로 진행할 수 있는 회의의 개수?
O(nlog n)
남은 회의 중 가장 빨리 끝나는 회의를 우선으로 배정한다
위 알고리즘으로 선택한 회의를 S, 최적해를 O라 하자
이때 각 집합은 회의가 빨리끝나는 순으로 indexing 되어있다
S:={p1, p2,⋅⋅⋅,pk}O:={q1, q2,⋅⋅⋅,ql}이때 어떤 최적해 알고리즘이 q1, q2, ...순으로 회의를 고른다고 가정하자
p 회의가 끝나는 시간을 f(p)로 표기하면
Claim
f(pi)≤f(qi), i=1, 2, ... , k, k=l
∵
i) i = 1 일때
trivialii) i 일때 준 명제가 성립한다고 가정
(준 알고리즘에서 선택할 수 있는 회의) \supset (최적해 알고리즘에서 선택할 수 있는 회의)
따라서 최적해 알고리즘에서 선택할 수 있는 회의가 있다고 하면 그 회의는 준 알고리즘에서도 고를 수 있다
또한 준 알고리즘은 진행할 수 있는 회의 중 가장 빨리 끝나는 회의를 고르므로 f(p_{i+1}) \leq f(q_{i+1}) □c++
12345678910111213141516171819202122232425262728293031#include <bits/stdc++.h>#define endl "\n"using namespace std;int n;priority_queue<pair<int, int>, vector<pair<int, int> >, 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;}cspython
12345678910111213141516171819import sysfrom heapq import *n = int(sys.stdin.readline())h = []for _ in range(n):s, e = map(int, sys.stdin.readline().split())h.append((e, s))heapify(h)e, _ = heappop(h)res = 1last = ewhile len(h):e, s = heappop(h)if s >= last:last = eres += 1print(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