有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室?
输入
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
输出
一行包含一个整数表示最少教室的个数。
输入示例
3 1 2 3 4 2 9
输出示例
2
题解:
先将活动按照开始时间小的在前,相同时则时间结束的在的在前然后只需要求出在一个活动进行时最多有几个活动也要进行。这时需要的教室数就是至少需要的数量
#include<bits/stdc++.h>
using namespace std;
#define M 20005
int n;
struct node{
long st,ed;
}a[M];
int cmp(node x,node y){//让结束时间小的排前面 如果当相同时则开始时间的的排前面。这样就让活动时间短结束的快的安排在前面
if(x.st!=y.st)return x.st<y.st;
else return x.ed<y.ed;
}
int main()
{
int sum=0;
int ans=0;
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i].st>>a[i].ed;
sort(a,a+n,cmp);
for(int i=0; i<n; i++){//求出当前线段与之前多少线段有重叠
sum=1;
for(int j=0; j<i; j++){
if(a[j].st<=a[i].st&&a[j].ed>a[i].st&&a[j].ed<=a[i].ed)
sum++;
else if(a[j].st<=a[i].st&&a[i].st<=a[j].ed&&a[j].ed>=a[i].ed)
sum++;
}
ans=max(ans,sum);
}
cout<<ans;
return 0;
}
//