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

http://poj.org/problem?id=3190

有n头挑剔的奶牛,只会在一个精确时间挤奶,而一头奶牛需要占用一个畜栏,并且不会和其他奶牛分享,每头奶牛都会有一个开始时间和结束时间,问至少需要多少个 畜栏  并且输出奶牛 i 在哪个畜栏 内挤奶。

首先应该对奶牛以开始时间从小到大排序,然后每次在开始的奶牛中选择结束时间最小的奶牛,这就需要用优先队列。看是否可以用这个畜栏,可以就加入到队列中,不可以就重新加一个畜栏。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 #include <map>
15 #include <queue>
16 
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18 
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24 
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d
", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("b.txt", "w", stdout);
36 #define maxn 1000000000
37 #define N 50010
38 using namespace std;
39 
40 struct point
41 {
42     int x,y,pos;
43     bool operator < (const point &a) const 
44     {
45         return y>a.y;  //按结束时间从小到大排序
46     }
47 };
48 
49 bool cmp(point a,point b)
50 {
51     return a.x<b.x;  //按开始时间从小到大排序
52 }
53 point p[N];
54 int use[N];   //存储第i头牛在哪个畜栏内挤奶
55 priority_queue<point>q;
56 int main()
57 {
58   //Read();
59    //Write()
60    int n;
61    while(~scanf("%d",&n))
62    {
63        for(int i=0;i<n;i++)
64        {
65            scanf("%d%d",&p[i].x,&p[i].y);
66            p[i].pos=i;
67        }
68        sort(p,p+n,cmp);  //先对奶牛排序
69        q.push(p[0]);   //把第一头奶牛加入队列
70        int ans=1;
71        use[p[0].pos]=1;
72        for(int i=1;i<n;i++)
73        {
74            if(!q.empty()&&q.top().y<p[i].x)  //队列非空并且当前奶牛的开始时间大于队列顶点的结束时间
75            {
76                use[p[i].pos]=use[q.top().pos];  //共用一个畜栏
77                q.pop();
78            }
79            else     //否则重新加一个 畜栏
80            {
81                ans++;
82                use[p[i].pos]=ans;
83            }
84            q.push(p[i]);
85        }
86        printf("%d
",ans);
87        for(int i=0;i<n;i++)
88         printf("%d
",use[i]);
89        while(!q.empty()) q.pop();
90    }
91    return 0;
92 }
原文地址:https://www.cnblogs.com/nowandforever/p/4415695.html