Stall Reservations POJ - 3190(贪心)

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

Hint

Explanation of the sample:

Here's a graphical schedule for this output:

Time     1  2  3  4  5  6  7  8  9 10

Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>
Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..
Stall 3 .. .. c3>>>>>>>>> .. .. .. ..
Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
Other outputs using the same number of stalls are possible.
 
 
题意:N头牛,每头牛都有霸占食槽的习惯,从【cow【i】.l,cow【i】.r】,被霸占的食槽,无法给其他牛使用,就必须多几个平行食槽
问最少几个平行食槽可供牛使用,且输出每个牛所在食槽处。
 
思路:一个食槽,能否放入下一个牛,取决于前一个牛的cow【i-1】.r 是否小于 cow【i】.l 
我们可以想到,如果cow【i-1】.r >= cow【i】.l ,  就需要另外开一行食槽。
cow【i-1】.r < cow【i】.l 那我们就可以把当前的cow【i】放到这一行食槽中。 
但是这样不一定是最优的,你虽让能放进去,但是前面牛的越早结束越好。
 这样的话就可以用一个最小堆维护每列牛最右边的食槽,
 
开始我想到这,以为有多少食槽就要建立多少个堆,让后再去找它符合哪个队(显然这样不行),其实只用一个堆就可以了,
一个堆的话如果右边界最小的你都不满足,那么其他的你肯定不满足
我们还需要事前将牛按照左边界排序,因为对于同一个最小的右边界,我们肯定希望塞入左边界最小的牛
 
 
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 5e4+5;
 8 int n;
 9 struct Node
10 {
11     int id;
12     int l,r;
13 };
14 
15 int mp[maxn];
16 Node cow[maxn];
17 bool cmp1(Node a,Node b)
18 {
19     return a.l < b.l;
20 }
21 
22 bool operator<(Node a,Node b)
23 {
24     return a.r > b.r;
25 }
26 
27 priority_queue<Node>que;
28 int main()
29 {
30     scanf("%d",&n);
31     for(int i=1; i<=n; i++)
32     {
33         scanf("%d%d",&cow[i].l,&cow[i].r);
34         cow[i].id = i;
35     }
36     sort(cow+1,cow+1+n,cmp1);
37     int k = 1;
38     for(int i=1; i<=n; i++)
39     {
40         if(que.empty())
41         {
42             mp[cow[i].id] = k;
43         }
44         else if(que.top().r < cow[i].l)
45         {
46 
47             mp[cow[i].id] = mp[que.top().id];
48             que.pop();
49         }
50         else
51             mp[cow[i].id] = ++k;
52         que.push(cow[i]);
53     }
54     printf("%d\n",k);
55     for(int i=1; i<=n; i++)
56     {
57         printf("%d\n",mp[i]);
58     }
59 }
View Code
 
 

猜你喜欢

转载自www.cnblogs.com/iwannabe/p/10193593.html