假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。
输入要求:
第一行为活动的个数 N(1<=N<=1 000 000) 。
接下来 N 行为 Si 和 Fi(0<=Si<Fi<=2 000 000 000) ,分别代表第 i 个活动的开始时间和结束时间。活动 i 的区间段为 [Si,Fi)
输出要求:
输出有一行 M ,为所需教室的最小数量。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 |
以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int m=1e6+5;
int n;
int a[m],b[m];
bool cmp(int z,int y){
return z<y;
}
int main()
{
int ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
sort(a,a+n,cmp); //活动开始时间
sort(b,b+n,cmp); //活动结束时间
int cal=0;
for(int i=0,j=0;i<n;)
{
if(a[i]<b[j])
{
cal++;
i++;
}
else //开始时间结束时间相等,先处理结束时间
{
cal--;
j++;
}
if(ans<cal) ans=cal;
}
cout<<ans<<endl;
return 0;
}
/*
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int m=1e6+5;
int n;
typedef struct hd{
int x,p;
}hd;
hd a[m];
bool cmp(hd z,hd y){
if(z.x!=y.x) return z.x<y.x; //sort属于不稳定排序,大量数据重合的情况下,不能保证终点一定在前面
else return z.p>y.p; //起点终点重合,终点放在前面
}
int main()
{
int ans=0,flag=0;
cin>>n;
n*=2;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].x);
a[i].p=flag; //0为活动开始时间,1为活动结束时间
flag=!flag;
}
sort(a,a+n,cmp);
int cal=0;
for(int i=0;i<n;i++)
{
if(a[i].p) cal--;
else cal++;
if(ans<cal) ans=cal;
}
cout<<ans<<endl;
return 0;
}
*/