poj3190 Stall Reservations

思路:

关于区间的贪心。

先对区间排序。再从前到后扫描,用堆维护当前最小的区间右端点right和对应的stall编号id,如果当前处理的区间的左端点大于right,则可以把这个区间放在编号为id的stall后面;否则重新开一个stall。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <algorithm>
 5 #include <functional>
 6 using namespace std;
 7 
 8 typedef pair<int, int> P;
 9 struct node
10 {
11     int index, left, right;
12 };
13 node a[50005];
14 int cow[50005];
15 int n;
16 priority_queue<P, vector<P>, greater<P> > pq;
17 
18 bool cmp(const node & a, const node & b)
19 {
20     if (a.left != b.left)
21     {
22         return a.left < b.left;
23     }
24     return a.right < b.right;
25 }
26 
27 int main()
28 {
29     cin >> n;
30     for (int i = 1; i <= n; i++)
31     {
32         a[i].index = i;
33         scanf("%d %d", &a[i].left, &a[i].right);
34     }
35     sort(a + 1, a + n + 1, cmp);
36     int cnt = 0;
37     pq.push(P(a[1].right, ++cnt));
38     cow[a[1].index] = cnt;
39     for (int i = 2; i <= n; i++)
40     {
41         if (a[i].left > pq.top().first)
42         {
43             P tmp = pq.top();
44             pq.pop();
45             cow[a[i].index] = tmp.second;
46             P tmp2(a[i].right, tmp.second);
47             pq.push(tmp2);
48         }
49         else
50         {
51             pq.push(P(a[i].right, ++cnt));
52             cow[a[i].index] = cnt;
53         }
54     }
55     cout << cnt << endl;
56     for (int i = 1; i <= n; i++)
57     {
58         cout << cow[i] << endl;
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/wangyiming/p/6588673.html