题意:
有若干只奶牛要进食,有进食的开始时间和结束时间。
但是一个位置只能容纳一只奶牛,所以就需要较多的位置。
显然,在一个位置,当一只奶牛进食结束后,另一只奶牛可以去进食。
问最少的位置以及每只奶牛被安排的位置。
思路:
贪心。
用一个优先队列存放奶牛,结束时间早的奶牛先出队列。
将所有奶牛按照开始时间排序,若相同,那么结束时间早的放前面。
对于一只奶牛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 ",ans); 94 95 for (int i = 0;i < n;i++) 96 { 97 printf("%d ",num[i]); 98 } 99 } 100 101 return 0; 102 }