zoukankan      html  css  js  c++  java
  • 活动选择

    活动选择

    题目描述

          学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。    

          现在给出n个活动使用礼堂的起始时间bi和结束时间ei(bi < ei<=32767),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。

    输入

      第一行一个整数n(n<=1000); 接下来的n行,每行两个整数,第一个bi,第二个是ei(bi < ei<=32767)

    输出

      输出最多能安排的活动个数

    样例输入

    11
    3 5
    1 4
    12 14
    8 12
    0 6
    8 11
    6 10
    5 7
    3 8
    5 9
    2 13

    样例输出

    4

     这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。

    考虑使用贪心算法的解法。为了方便,我们用不同颜色的线条代表每个活动,线条的长度就是活动所占据的时间段,蓝色的线条表示我们已经选择的活动;红色的线条表示我们没有选择的活动。
    如果我们每次都选择开始时间最早的活动,不能得到最优解:

    如果我们每次都选择持续时间最短的活动,不能得到最优解:

    可以用数学归纳法证明,我们的贪心策略应该是每次选取结束时间最早的活动。直观上也很好理解,按这种方法选择相容活动为未安排活动留下尽可能多的时间。这也是把各项活动按照结束时间单调递增排序的原因。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int begin;
        int end;
    };
    bool cmp(const node& a,const node&b){
        return a.end<b.end;
    }
    
    int main(){
        int n;
        cin>>n;
        node * p = new node[n];
        for (int i = 0; i < n; i++)
        {
            cin>>p[i].begin>>p[i].end;
        }
        sort(p,p+n,cmp);
        node before=p[0];
        int ans=1;
        for (int i = 1; i < n; i++)
        {
            if (p[i].begin>=before.end)
            {
                ans++;
                before= p[i];
            }
        }
        cout<<ans<<endl;
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13681591.html

  • 相关阅读:
    帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法
    Web页中table导出到execl(带模板)
    Jquery选择器
    JS 用window.open()函数,父级页面如何取到子级页面的返回值?
    SQL2008:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
    划线标注
    Unity与Android间的交互
    ActiveMQ的配置与使用
    OpenCv的Java,C++开发环境配置
    JDBC的超时原理
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13681591.html
Copyright © 2011-2022 走看看