Input
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
3 1 2 3 4 2 9
Output示例
2
曹鹏
(题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB
示例及语言说明请按这里
贪心算法,需要用到优先队列。
priority_queue<int ,vector<int >,greater<int> >s;
先输出小的。
我们用它保存y值。首先先把第一个活动的y值放入。
之后进入for循环,如果当前的开始时间小于队列中第一个(也就是最早结束的时间),那么我们只能重新开一个教室,并把当前的结束时间放入队列当中。 如果大于等于,那就把那个拿走,那当前的放入。
可以说就是不停地和已有的教室的结束时间作比较。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
struct node
{
long long x;
long long y;
}a[100001];
priority_queue<int ,vector<int >,greater<int> >s;
bool cmp(node t1,node t2)
{
return t1.x<t2.x;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+n,cmp);
int ans=1;
s.push(a[1].y);
for(int i=2;i<=n;i++)
{
int t=s.top();
if(a[i].x>=t)
{
s.pop();
s.push(a[i].y);
}
else
{
ans++;
s.push(a[i].y);
}
}
cout<<ans<<endl;
return 0;
}
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
struct node
{
long long x;
long long y;
}a[100001];
priority_queue<int ,vector<int >,greater<int> >s;
bool cmp(node t1,node t2)
{
return t1.x<t2.x;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+n,cmp);
int ans=1;
s.push(a[1].y);
for(int i=2;i<=n;i++)
{
int t=s.top();
if(a[i].x>=t)
{
s.pop();
s.push(a[i].y);
}
else
{
ans++;
s.push(a[i].y);
}
}
cout<<ans<<endl;
return 0;
}