• ACM_区间调度问题(贪心)


    Meetings 系列一

    Time Limit: 2000/1000ms (Java/Others)

    Problem Description:

     多年之后的广财ACM编协如日中天,下系多个部门,且编协成员几近过百。这一次,为了庆祝ACM编协近年飞速的发展,各部门都决定在同一天召开会议。请注意:这次由于资源紧张,仅申请到一个报告厅。现在需要你给出安排方案,使得同一天24小时内举行的会议场次尽可能多。
     为了简化问题,作如下规定:
    (1)每一场会议M(a,b)表示从a时刻开始,b时刻结束(其中,a,b都为整数且8 <= a < b <= 20);
    (2)同一时段内报告厅仅允许一个部门进行开会,不同部门交接时可忽略不同场次交换耗费的时间。

    Input:

    输入包含多组测试数据,每组数据第一行输入整数n(0<n<=20)表示一共有n场会议要安排。下面n行依次输入每一场会议的开始跟结束时刻a,b。

    Output:

    每一组测试输出可以安排的场次的最大数目,占一行。

    Sample Input:

    3 
    12 15
    12 13
    14 18
    5 
    11 12
    13 18
    18 20
    13 16
    16 17

    Sample Output:

    2
    4
    解题思路:贪心策略:将所有区间按右端点坐标(结束时间)从小到大排序,顺序处理每个区间。如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。注意:起始时间和结束时间在8-20范围内。
    算法证明--->博主:阳光日志

    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct NODE{
     4     int st,ed;
     5 }node[21];
     6 bool cmp(NODE x,NODE y){
     7     return x.ed<y.ed;  //按结束时间早的升序排
     8 }
     9 int main()
    10 {
    11     int n,num,k,t,s,e;
    12     while(cin>>n){
    13         k=-1;
    14         for(int i=1;i<=n;++i){
    15             cin>>s>>e;
    16             if(s>=8 && e<=20){node[++k].st=s;node[k].ed=e;}
    17         }
    18         sort(node,node+k+1,cmp);
    19         num=t=0;
    20         for(int i=0;i<=k;++i)
    21             if(t<=node[i].st){num++;t=node[i].ed;}
    22         cout<<num<<endl;
    23     }
    24     return 0;
    25 }

    也可以使用STL中的pair<int,int>。AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,num,k,t,s,e;pair<int,int> itv[21];
     6     while(cin>>n){
     7         k=-1;
     8         for(int i=1;i<=n;++i){   //second记录起始时间,first记录结束时间
     9             cin>>s>>e;        //这样就按照结束时间早的升序排
    10             if(s>=8 && e<=20){itv[++k].second=s;itv[k].first=e;}
    11         }
    12         sort(itv,itv+k+1);num=t=0;
    13         for(int i=0;i<=k;++i)
    14             if(t<=itv[i].second){num++;t=itv[i].first;}
    15         cout<<num<<endl;
    16     }
    17     return 0;
    18 }
  • 相关阅读:
    必懂的wenpack优化
    必懂的webpack高级配置
    webpack基础知识
    vue-cli
    codemirror使用
    js实现二叉树
    react-生命周期
    window 批量修改或去除文件后缀名
    十分钟搞清字符集和字符编码
    php判断一个值是否在一个数组中,区分大小写-也可以判断是否在键中
  • 原文地址:https://www.cnblogs.com/acgoto/p/9013241.html
Copyright © 2020-2023  润新知