51nod 1428 活动安排问题
题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=1428
一、题目描述
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
输入
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
输出
一行包含一个整数表示最少教室的个数。
输入样例
3
1 2
3 4
2 9
输出样例
2
二、代码
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struct node{ int t;//时间 int insert;//是开始活动还是结束活动 }a[10000001]; bool cmp(node x, node y){ if(x.t != y.t){//如果时间不一样 return x.t < y.t;//时间小的排前面 }else{//如果时间一样 return x.insert != 0; } } int main(){ int n, start, end, cur=0, ans=0; cin >> n; for(int i = 0;i < n;i++){ cin >> start >> end;//因为要乘二是避免重复 a[i*2].t = start;//a[i*2].t 为start时间是第2*i个活动开始的时间 a[i*2].insert = 0;//insert为开始一个活动 a[i*2+1].t = end;//a[i*2].t 为end时间是第2*i个活动结束的时间,要加1是因为避免重复 a[i*2+1].insert = 1;//insert为结束一个活动 } sort(a,a+2*n,cmp);//按照时间排序,如果时间重复结束一个活动排在前面 for(int i = 0;i < 2*n;i++){ if(a[i].insert){//如果现在结束一个活动 cur--; //现在使用的房间数-1 }else{//如果现在开始一个活动 cur++; //现在使用的房间数+1 } ans = max(ans,cur);//如果现在需要的房间数多了,更新最多房间数 } cout << ans << endl; return 0; }