Description
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
Input
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Sample Input
3
1 2
3 4
2 9
Sample Output
2
题解:
先按照开始时间升序排列 将第一个结束时间push进最小堆中如果接下来的开始时间比堆顶元素大则pop堆顶元素 否则压入新的元素并且+1
AC代码
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
#define N 10010
struct node {
int a, b;
}p[N];
bool cmp(node x, node y)
{
return x.a < y.a;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < n; i++) {
scanf("%d%d",&p[i].a,&p[i].b);
}
sort(p,p+n,cmp);
int k = 1;
priority_queue<int, vector<int>, greater<int> > fq;
fq.push(p[0].b);
for(int i = 1;i < n; i++) {
if(!fq.empty()) {
int x = fq.top();
if(p[i].a < x) {
k++;
fq.push(p[i].b);
}
else {
fq.pop(); fq.push(p[i].b);
}
}
else {
k++;
fq.push(p[i].b);
}
}
printf("%d\n",k);
return 0;
}