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\n", 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\n",ans); 87 for(int i=0;i<n;i++) 88 printf("%d\n",use[i]); 89 while(!q.empty()) q.pop(); 90 } 91 return 0; 92 }