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 }   

 

posted @ 2019-08-23 10:25  VBL  阅读(166)  评论(0编辑  收藏  举报