• 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;
    }
  • 相关阅读:
    Variant 数组
    socket c/s分佈式編程
    多線程幾個方法說明
    hash表的使用
    MIS系统权限控制的一个简便方法
    git 使用总结
    让 VAGRANT 启动并运行起来
    深入理解 Laravel 中 config 配置加载原理
    Vagrant入门
    php开发APP接口(总结一)
  • 原文地址:https://www.cnblogs.com/elisa02/p/12778730.html
Copyright © 2020-2023  润新知