poj3190
一、题意:有n头牛,每头牛需要占用一个时间段的时间来挤奶,且必须有机器。问最少需要多少个机器
二、思路:区间贪心。把尽量多的牛放在一个棚子里,这样就可以使得用到的棚子数最少。只要任意两头牛的挤奶时间不重合,就可以放在一个棚子里。因为N值比较大,先标记好每一头牛的起始坐标,然后按起始时间从小到大进行排序,然后依次从前往后去遍历每一头牛。这里需要用一个优先队列来维护,以结束时间从小到大来维护,每次将一头牛与队列首的牛进行比较,如果满足它的起始时间大于队列首的那头牛的结束时间,这两头牛就可以使用同一个机器,否则就新加一个机器。这里需要注意牛的入队和出队
三、代码
#include"iostream" #include"stdio.h" #include"queue" #include"algorithm" using namespace std; const int MAXN=50005; struct Node { int s,e,pos; friend bool operator<(Node a,Node b) { if(a.e==b.e) return a.s<b.s; return a.e>b.e; } }; bool Cmp(Node a,Node b) { if(a.s!=b.s) return a.s<b.s; else return a.e<b.e; } Node cows[MAXN]; priority_queue<Node>que; int order[MAXN]; int main() { int n; while(scanf("%d",&n)==1) { for(int i=0;i<n;i++) { scanf("%d%d",&cows[i].s,&cows[i].e); cows[i].pos=i; } sort(cows,cows+n,Cmp); que.push(cows[0]); order[cows[0].pos]=1; for(int i=1;i<n;i++) { if(cows[i].s>que.top().e) { order[cows[i].pos]=order[que.top().pos]; que.pop(); que.push(cows[i]); } else { que.push(cows[i]); order[cows[i].pos]=que.size(); } } cout<<que.size()<<endl; for(int i=0;i<n;i++) { cout<<order[i]<<endl; } } return 0; }