zoukankan      html  css  js  c++  java
  • 活动安排问题之二

    有若干个活动,第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 }
  • 相关阅读:
    Conversions
    Mispelling4
    A hard puzzle
    Easier Done Than Said?
    利用map可以对很大的数出现的次数进行记数
    A+B Coming
    结构体成员变量
    NSString 类介绍及用法
    复习回顾
    函数与方法对比
  • 原文地址:https://www.cnblogs.com/ledoc/p/6559711.html
Copyright © 2011-2022 走看看