基准时间限制: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 <bits/stdc++.h>
using namespace std;
const int N = 10000+5;
struct node {
int s,f;
node(int _s,int _f) {
s = _s; f = _f;
}
node(){};
bool operator < ( const node &a ) const {
if ( a.f!=f ) return f>a.f;
else return s>a.s;
}
};
bool cmp( const node &a,const node b ) {
return a.s<b.s;
}
vector<node> vec;
priority_queue<node> que;
int main()
{
int n;
int s,f;
cin>>n;
for ( int i=0; i<n; i++) {
scanf("%d%d",&s,&f);
vec.push_back( node(s,f) ) ;
}
sort( vec.begin(),vec.end(),cmp );
que.push( vec[0] ) ;
node t;
for ( int i=1; i<n; i++ ) {
t = que.top();
if ( vec[i].s<t.f ) {
que.push( vec[i] ) ;
} else {
que.pop();
que.push( vec[i] ) ;
}
}
cout<<que.size()<<endl;
return 0;
}