题意:
一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作。给你每头奶牛的指定时间的区间(闭区间),问你最小需要多少机器。
思路:
先按奶牛要求的时间起始点进行从小到大排序,然后维护一个优先队列,里面以已经开始挤奶的奶牛的结束时间早为优先。然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。
注意:利用priority_queue<Node,vector<Node>,less<Node>>qe;这个定义后可以将元素从大到小插入元素,但是注意的是结构体中必须重载<操作符,不然会出错,如果不是结构体而是int类型则不用重载
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn=60000; int n,use[maxn]; struct Node { int l; int r; int pos;//原顺序输出 //注优先队列的重载<与sort的重载<结论相反,优先级大的先输出 bool operator <(const Node &a)const { if(r==a.r) return l>a.l; return r>a.r; } }a[maxn]; priority_queue<Node> q; bool cmp(Node a,Node b) { if(a.l==b.l) return a.r<b.r; return a.l<b.l; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].pos=i; } sort(a,a+n,cmp); q.push(a[0]); int ans=1; use[a[0].pos]=1; for(int i=1;i<n;i++) { if(!q.empty()&&q.top().r<a[i].l) { use[a[i].pos]=use[q.top().pos]; q.pop(); } else { ans++; use[a[i].pos]=ans; } q.push(a[i]); } printf("%d ",ans); for(int i=0;i<n;i++) printf("%d ",use[i]); while(!q.empty()) q.pop(); } return 0; }