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;
}
原文地址:https://www.cnblogs.com/elisa02/p/12778730.html