活动安排问题 (51nod)

来源:互联网 发布:手机版淘宝怎么买二手 编辑:程序博客网 时间:2024/04/30 11:25

原题链接


问题:

有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 


Input
第一行一个正整数n (n <= 10000)代表活动的个数。
        第二行到第(n + 1)行包含n个开始时间和结束时间。
        开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Sample Input
31 23 42 9
Sample Output
2

找出同时进行活动的最大班级数,即为所求(sum)。

用两个数组来 记录 开始的时间 和 结束的时间,

都从小到大排序。

设想:

这两组数据揉成一组,并且是按从小到大的顺序排列的。

那么 从头开始遍历。

如果 当前数字代表的是开始时间,那么 sum++;

如多 当前数字代表的是结束时间,那么 sum--;

过程中,sum的最大值即为所求。!

下面用横线来模拟这个过程。(红色的条数 便是 sum。)

每条线都有一个 开始点 和 结束点。


        ____

             ______

___

     _____

                      _____



但是,我并不会把他们揉成一组,然后再判断 的这个操作(大哭


思考后发现(也参考了网上的思路)

并不需要真的揉成一组。

也不需要每个数据都遍历。

只需要 把 排序后的开始时间 遍历一遍。!!

先与第一个 结束时间 比较,如果开始时间小(也就是揉成一组后的开始时间在前),sum++,

如果一个开始时间大 ,就拿 下一个开始时间 与 第二个 结束时间比较(否则一直与第一个结束时间比较)(也就是香相当于揉成一组后,遍历到了 结束时间。)

#include <iostream>#include <queue>#include <algorithm>#define LL long longusing namespace std;LL start[10010];LL endt[10010];int main(){    int n;    cin>>n;    for(int i = 0;i < n;i++)    {        cin >> start[i] >> endt[i];    }    sort(start,start+n);    sort(endt,endt+n);    int end_x = 0;    int sum = 0,t = 0;    for(int i = 0;i < n;i ++)    {        if(start[i]<endt[end_x])        {            sum ++;        }        else        {            end_x ++;        }    }    cout << sum <<endl;    return 0;}







阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 幕阜山森林公园 天岳幕阜山 平江幕阜山 住宿 幢和栋的区别 幢字组词 喉咙干痒咳 嗓子干痒咳 喉咙干有痰咳不出 嗓子干痒咳怎么办 宝宝咳嗽咳不出来干呕 干卿何事 干卿底事 卿尔美多少钱一盒 宠卿入我怀 鹿一哒 杯莫停干凝蓉凝蔚短文 来吧朋友干这杯酒歌词 干了这杯酒 干一杯 干一杯酒 干一杯白酒 兄弟干一杯原唱 酒一杯一杯一杯的干是什么歌 朋友干一杯歌词 干一杯歌词 干一杯歌曲 干了这一杯 兄弟干一杯歌词 干一杯酒往事就不用再回头 好兄弟干一杯是什么歌 组织部是干什么的 外强中干什么意思 统战部干什么的 重阳节干什么 检察院是干什么的 检察院干什么 公务员是干什么 公务员干什么 我在干什么 说干什么 说干什么呢mp3 干什么干什么词语