题解:
此题和最少拦截系统相似!!但是这道题的每组数据是两个而那道题是一个,这就是不同点。
首先定义一个优先队列,priority_queue<int,vector<int>,greater<int> >q
;
这个容器是用来装已经用过的和将最小的使用重新更新填入数据(这个最小的要被删除q.pop(最小),
然后填入这个新数据q.push(新数据)),
重要的是这些数据都是区间右端点!!
因为这是所有区间左端点都被排序sort()便于计算,和统计。
最后计入容器的数据长度就是最少教室数。
话不多少,上代码:::::
题目:
1428 活动安排问题
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
Input
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
3
1 2
3 4
2 9
Output示例
2
曹鹏 (题目提供者)
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct qujian{
int l,r;
}p[10001];
int cmp(qujian a,qujian b)
{
return a.l<b.l;
}
int main()
{
int a,n;
priority_queue<int,vector<int>,greater<int> >q;
cin>>n;
for(int i=0;i<n;i++)cin>>p[i].l>>p[i].r;
sort(p,p+n,cmp);
q.push(p[0].r);
for(int i=1;i<n;i++)
{
a=q.top();
if(p[i].l>=a)
{
q.pop();
q.push(p[i].r);
}
else q.push(p[i].r);
}
cout<<q.size()<<endl;
return 0;
}