活动安排问题之二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室?
输入
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
输出
一行包含一个整数表示最少教室的个数。
输入示例
3 1 2 3 4 2 9
输出示例
2
这个问题看上去和前面那个活动例题很像啊?...可惜不能用前面的方法
这个题目写清楚了要讲全部活动都安排到位...所以我们就按照活动开始时间升序排序...可以从头到尾扫一遍,如果当前被安排的教室里面可以安排我们现在要安排的活动,则将
当前活动放进去,否则就必须再开一间教室。。。
这么一分析,我们发现最少教室个数就是区间中重叠点最多的个数,然后数起点个数和结尾个数就可以了
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<set> 5 using namespace std; 6 7 set<int>sta, ed; 8 int l[10005], r[10005], a[20010]; 9 int main(){ 10 int n, k=0; 11 cin>>n; 12 for(int i=0; i<n; i++){ 13 cin>>l[i]>>r[i]; 14 sta.insert(l[i]); 15 ed.insert(r[i]); 16 } 17 int len=0; 18 for(int i=0; i<n; i++){ 19 a[len++]=l[i]; 20 a[len++]=r[i]; 21 } 22 sort(a, a+len); 23 int Len=1; 24 /* 25 for(int i=1; i<len; i++){ 26 if(a[i]!=a[i-1]) a[Len++]=a[i]; 27 }*/ 28 int ans=0; 29 for(int i=0; i<len; i++){ 30 if(ed.count(a[i]))k--; 31 if(sta.count(a[i])) k++; 32 ans=max(ans, k); 33 } 34 cout << ans << endl; 35 return 0; 36 }