Cleaning Shifts POJ 2376(区间贪心)
原题
题目分析
先按起始时间排序,然后规定一个变量来记录当前时间,假设当前时间是t(当前时间还未被清理),那就在排完序的区间里把起始时间小于t的牛依次加入到一个优先队列中,在优先队列里每次都取终止时间最长的牛,并以此来更新当前时间.假设取出一种牛[si,ti],si<t,则取出后t=ti+1就行了.
代码
1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <string> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <map> 12 #include <set> 13 14 using namespace std; 15 typedef long long LL; 16 const int INF_INT=0x3f3f3f3f; 17 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 18 19 map<int,int> lef; 20 int righ[25000]; 21 22 int solve(int n) 23 { 24 priority_queue<int> que; 25 que.push(0); 26 int cnt=0,maxn=-1; 27 map<int,int>::iterator it=lef.begin(); 28 while(que.size()) 29 { 30 int p=que.top();que.pop(); 31 if(p<=maxn) return -1; 32 maxn=p,cnt++; 33 if(p>=n) return cnt-1; 34 while(it->first<=p+1&&it!=lef.end()) que.push(righ[it->second]),it++; 35 } 36 return -1; 37 } 38 39 int main() 40 { 41 // freopen("black.in","r",stdin); 42 // freopen("black.out","w",stdout); 43 int n,t; 44 scanf("%d %d",&n,&t); 45 for(int i=0;i<n;i++) 46 { 47 int x,y; 48 scanf("%d %d",&x,&y); 49 lef.insert(make_pair(x,i)); 50 righ[i]=y; 51 } 52 // for(map<int,int>::iterator it=lef.begin();it!=lef.end();it++) printf("left:%d cnt:%d\n",it->first,it->second); 53 // for(int i=0;i<n;i++) printf("right:%d cnt=%d\n",righ[i],i); 54 printf("%d\n",solve(t)); 55 return 0; 56 }