NSOJ 会场安排问题 &&

本文介绍了一种解决会场活动安排问题的算法,通过合理的排序和贪心策略,实现活动的最大化安排,适用于多场景时间资源分配问题。

会场安排问题

时间限制: 3000ms
内存限制: 128000KB
64位整型:      Java 类名:
类型: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • 题目描述

    学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。

    输入

    第一行是一个整型数m(m<100)表示共有m组测试数据。
    每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
    随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)

    输出

    对于每一组输入,输出最多能够安排的活动数量。
    每组的输出占一行

    样例输入

    2
    2
    1 10
    10 11
    3
    1 10
    10 11
    11 20
    
    

    样例输出

    1
    2
    

    提示

    注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    struct note
    {
        int begin,end;
    } que[10000];
    int cmp(note a,note b)
    {
        if(a.end!=b.end)
        return a.end<b.end;
        else return a.begin<b.begin;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int i,n,term;
            scanf("%d",&n);
            for(i=0; i<n; i++)
                scanf("%d %d",&que[i].begin,&que[i].end);
            sort(que,que+n,cmp);
            int  sum=1;
            term=que[0].end;
            for(i=1; i<n; i++)
            {
              if(que[i].begin>term)
              {
                  term=que[i].end;
                  sum++;
              }
            }
            printf("%d\n",sum);
        }
        return 0;
    }

    题目链接 

    贪心题:思路简单,我用标记的方法,和素数筛选思想类似。代码很简单

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    bool vis[100000];
    struct node
    {
        int begin;
        int end;
    } Q[10100];
    bool cmp(node a,node b)
    {
        if(a.begin==b.begin)
            return a.end<b.end;
        else  return a.begin<b.begin;
    
    }
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            for(int i=0; i<n; i++)
                scanf("%d %d",&Q[i].begin,&Q[i].end);
            sort(Q,Q+n,cmp);
            memset(vis,0,sizeof(vis));
            int cont=0;
            for(int i=0; i<n; i++)
            {
                if(vis[i])continue;
                int term=Q[i].end;
                vis[i]=1;
                cont++;
                for(int j=i+1; j<n; j++)
                {
                    if(Q[j].begin>=term&&!vis[j])
                    {
                        term=Q[j].end;
                        vis[j]=1;
                    }
                }
            }
            printf("%d\n",cont);
        }
        return 0;
    }
    


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值