标签:50000 const int Reservations LL 队列 Stall POJ include
原题
题目分析
分开处理,可以按起始时间给所有牛排个序,然后从小到大遍历所有牛,每遍历一头牛i就把他加入到一个优先队列中,然后从优先队列中取出结束时间最大的牛j,如果牛j的结束时间比牛i的起始时间小,那证明轮到该牛时已经可以多出一个桶了,于是可以把牛j从优先队列从弹出,并让桶的数量--,注意一下要记录一下每个牛的编号就行了.
代码
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 typedef pair<int,int> P; 19 20 struct G 21 { 22 int first,second,order; 23 }interval[50000]; 24 int used[50000]; 25 26 bool cmp(G a,G b) 27 { 28 return a.first<b.first; 29 } 30 31 int main() 32 { 33 // freoGen("black.in","r",stdin); 34 // freopen("black.out","w",stdout); 35 int n; 36 cin>>n; 37 for(int i=0;i<n;i++) scanf("%d %d",&interval[i].first,&interval[i].second),interval[i].order=i; 38 sort(interval,interval+n,cmp); 39 priority_queue<P,vector<P>,greater<P> > que; 40 int i=0,now=0,ans=0,cnt=0; 41 while(i<n) 42 { 43 que.push(P(interval[i].second,interval[i].order)); 44 now=interval[i].first; 45 cnt++; 46 if(que.top().first<now) used[interval[i].order]=used[que.top().second],que.pop(),cnt--; 47 else used[interval[i].order]=cnt; 48 ans=max(cnt,ans); 49 i++; 50 } 51 printf("%d\n",ans); 52 for(int i=0;i<n;i++) printf("%d\n",used[i]); 53 return 0; 54 }
标签:50000,const,int,Reservations,LL,队列,Stall,POJ,include 来源: https://www.cnblogs.com/VBEL/p/11399177.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。