POJ-3190 Stall Reservations (优先队列+贪心)

题目:

Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.

Help FJ by determining:

  • The minimum number of stalls required in the barn so that each cow can have her private milking period
  • An assignment of cows to these stalls over time

Many answers are correct for each test dataset; a program will grade your answer.

Input:

Line 1: A single integer, N

Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.

Output:

Line 1: The minimum number of stalls the barn must have.

Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.

Sample Input:

5

1 10

2 4

3 6

5 8

4 7

Sample Output:

4

1

2

3

2

4

 


 

思路:

  • 一开始以为这题跟我以前做的一道求最大重叠区间数一样,然后发现要求每头牛安排在哪个棚就不能按那题的方法;
  • 我用当时做的比较笨的方法一个个棚求可以合并的牛,过了样例,但由于区间范围比那题大很多所以不出所料TLE;
  • 一开始想用离散化优化没写出来,后来看了别人的博客才知道用优先队列优化更方便。


Code:

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 
 7 using namespace std;
 8 const int MAXN = 50010;
 9 int cnt[MAXN];
10 
11 struct node {
12     int l, r, id;
13     friend bool operator < (node a, node b) {
14         return a.r > b.r;
15     }
16 }a[MAXN];
17 
18 bool cmp(node a, node b) {
19     if (a.l == b.l) return a.r < b.r;
20     return a.l < b.l;
21 }
22 
23 priority_queue<node> q;
24 
25 int main() {
26     std::ios::sync_with_stdio(false);
27     int n;
28     while(cin>>n) {
29         for (int i = 0; i < n; ++i) {
30             cin>>a[i].l>>a[i].r;
31             a[i].id = i;
32         }
33         sort(a, a+n, cmp);
34         int ans = 0;
35         for (int i = 0; i < n; ++i) {
36             if (!q.empty() && q.top().r < a[i].l) {
37                 cnt[a[i].id] = cnt[q.top().id];
38                 q.pop();
39             }
40             else cnt[a[i].id] = ++ans;
41             q.push(a[i]);
42         }
43         cout<<ans<<endl;
44         for (int i = 0; i < n; ++i) cout<<cnt[i]<<endl;
45     }
46 
47     return 0;
48 }

 

posted @ 2017-02-01 21:23  Robin!  阅读(152)  评论(0编辑  收藏  举报