问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室?
输入
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
输出
一行包含一个整数表示最少教室的个数。
输入示例
3
1 2
3 4
2 9
输出示例
2
算法代码
/** 活动安排之二 用活动时间去找教室,把活动时间按开始时间优先排序 不冲突则加入同一间教室,冲突则增加一间教室数(sum) **/ #include <stdio.h> struct time { long start; long end; }TIME[10000]; typedef struct time Time; void SortTime(Time TIME[],int n); long ClassroomNum(Time TIME[],int n); int b[10000];//记录结束时间 int main() { int n; scanf("%d",&n); int i=0; for(i=0;i<n;i++) { scanf("%ld%ld",&TIME[i].start,&TIME[i].end); } SortTime(TIME,n); printf("%ld",ClassroomNum(TIME,n)); return 0; } void SortTime(Time TIME[],int n) { int i = 0,j = 0; Time temp; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(TIME[i].start >= TIME[j].start) { temp = TIME[i]; TIME[i] = TIME[j]; TIME[j] = temp; } } } } long ClassroomNum(Time TIME[],int n) { int i=0,j=0; b[0]=TIME[0].end;//记录结束时间 long sum = 1; for(i=1;i<n;i++) { for(j=0;j<sum;j++) { if(TIME[i].start >= b[j])//满足该条件,则此活动可以加入该教室 { //更新时间 b[j] = TIME[i].end; break; } } if(j == sum) { //另外增加一个教室,记录结束时间 b[sum] = TIME[i].end; ++sum; } } return sum; }