poj 3190 Stall Reservations

题意:

有若干只奶牛要进食,有进食的开始时间和结束时间。

但是一个位置只能容纳一只奶牛,所以就需要较多的位置。

显然,在一个位置,当一只奶牛进食结束后,另一只奶牛可以去进食。

问最少的位置以及每只奶牛被安排的位置。

思路:

贪心。

用一个优先队列存放奶牛,结束时间早的奶牛先出队列。

将所有奶牛按照开始时间排序,若相同,那么结束时间早的放前面。

对于一只奶牛X,若当前队列为空(只有开始放第一只奶牛才存在这个情况),那么随便安排一个小于已知位置个数的位置;

若队列不为空,那么出队一只奶牛Y,如果Y的结束时间小于X的开始时间,那么X就可以被安排到Y的位置上;如果Y的结束时间小于等于X的开始时间,那么显然需要多安排一个位置。

这个过程中不会出现某一个中间位置空缺的情况,因为空闲的位置一定会被占领。

代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <queue>
  4 #include <vector>
  5 #include <algorithm>
  6 using namespace std;
  7 
  8 const int N = 5e4 + 5;
  9 
 10 struct node
 11 {
 12     int st,en,id;
 13     node(){};
 14     node(int a,int b,int c)
 15     {
 16         st = a;
 17         en = b;
 18         id = c;
 19     }
 20     
 21     bool operator < (const node &x) const
 22     {
 23         return en > x.en;
 24     }
 25 };
 26 
 27 vector<node> g;
 28 
 29 bool cmp(node aa,node bb)
 30 {
 31     if (aa.st == bb.st) return aa.en < bb.en;
 32     return aa.st < bb.st;
 33 }
 34 
 35 int num[N];
 36 
 37 int solve(int n)
 38 {
 39     int cnt = 1;
 40     
 41     priority_queue<node> pq;
 42     
 43     for (int i = 0;i < n;i++)
 44     {
 45         if (pq.empty())
 46         {
 47             num[g[i].id] = cnt;
 48             pq.push(g[i]);
 49         }
 50         else
 51         {
 52             node x = pq.top();
 53             
 54             if (x.en < g[i].st)
 55             {
 56                 num[g[i].id] = num[x.id];
 57                 pq.pop();
 58                 pq.push(g[i]);
 59             }
 60             else
 61             {
 62                 num[g[i].id] = ++cnt;
 63                 pq.push(g[i]);
 64             }
 65         }
 66     }
 67     
 68     return cnt;
 69 }
 70 
 71 int main()
 72 {
 73     int n;
 74     
 75     while (scanf("%d",&n) != EOF)
 76     {
 77         g.clear();
 78         memset(num,0,sizeof(num));
 79         
 80         for (int i = 0;i < n;i++)
 81         {
 82             int x,y;
 83             
 84             scanf("%d%d",&x,&y);
 85             
 86             g.push_back(node(x,y,i));
 87         }
 88         
 89         sort(g.begin(),g.end(),cmp);
 90         
 91         int ans = solve(n);
 92         
 93         printf("%d\n",ans);
 94         
 95         for (int i = 0;i < n;i++)
 96         {
 97             printf("%d\n",num[i]);
 98         }
 99     }
100     
101     return 0;
102 }

 

posted @ 2018-04-12 15:38  qrfkickit  阅读(168)  评论(0编辑  收藏  举报