有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Sample Input
3
1 2
3 4
2 9
Sample Output
2
题解:首先将开始时间和结束时间分别放进s和t数组里,
然后从s数组里的第一个元素s1开始和t的第一个元素t2
进行比较,若s1比t1大,则count++,然后比较s2和t1,
若t1大,则比较t2,以此重复循环,直至s或t数组遍历完。
这样写的目的是:当开始时间小于结束时间,说明得需要
加一个房间供此活动,如果大于,说明可以在同一个房间,
不需要+1.
#include<cstdio>
#include<algorithm>
using namespace std;
int starttime[10001];
int endtime[10001];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<=n-1;i++){
scanf("%d",&starttime[i]);
scanf("%d",&endtime[i]);
}
sort(starttime,starttime+n);
sort(endtime,endtime+n);
int sum=0;
int a=0;
int b=0;
for(a=0;a<=n-1;a++){
if(starttime[a]<endtime[b]){//开始时间小于结束时间
sum++;
}else{//开始时间大于等于结束时间
b++;
}
}
printf("%d",sum);
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct sj {
int b;
int e;
int s;
} a[10010];
int cmp(sj x,sj y) {
if(x.b==y.b)
return x.e<y.e;
else
return x.b<y.b;
}
int main() {
int n,e;
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d%d",&a[i].b,&a[i].e);
a[i].s=0;
}
sort(a,a+n,cmp);
int count=0;
for(int i=0; i<n; i++) {
if(a[i].s==0) {
a[i].s=1;
e=a[i].e;
count++;
}
for(int j=i; j<n; j++) {
if(a[j].s==0&&a[j].b>=e) {
a[j].s=1;
e=a[j].e;
}
}
}
printf("%d\n",count);
return 0;
}