会场安排问题

关于会场安排问题

关于这个问题我的设计思路就是先找一个最早开始的活动占一个会场,然后去查找这个会场还能否继续举办其他活动(即活动举办完后在未举行的活动中查找有没有符合时间关系的),找的这个活动应该是离刚举办完的活动时间关系最近的一个,这样一直找下去,直到这个会场不能再继续举办活动,再新立一个会场从头开始找最早开始的活动。注意一点就是凡是举办过的活动都会在数组中删除,直到最后数组为空,输出所用会场总数。

问题描述:

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数)。

算法设计
对于K个待安排的活动,计算使用最少会场的时间表。

输入输出
input.txt
5
1 23
12 28
25 35
27 80
36 50
output.txt
3

#include <stdio.h>

int main()
{
    int n,m,m1,m2;
    scanf("%d",&n);
    int s[n],e[n];
    int sum=0;         //用来记录总和
    int flag;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&s[i]);      //输入各活动的起始时间
        scanf("%d",&e[i]);      //输入各活动的终止时间
    }
    while(n>0){
        sum++;      //会场使用数+1
        m1 = 1000;
        m2 = 1000;
        m = 0;
        for(int i=0;i<n;i++){        //先找出一个最早开始的活动
            if(m1>s[i]){
                m1 = s[i];
                m2 = e[i];
                m = i;
            }

        }
        n--;    //记录完之后将在数组中删除这个活动
        for(int i=m;i<n;i++){
            s[i]=s[i+1];
            e[i]=e[i+1];
        }       //删除完毕
        flag=1;
            while(flag&&n>0){    //在此进行判断一个会场最多可以举办多少个活动
                flag=0;
                m1=1000;
                for(int i=0;i<n;i++){
                    if(s[i]>m2&&s[i]<m1){    //查询该会场一个活动结束后是否可以继续举办下一个活动,即时间关系,找离得最近的
                        m=i;
                        m1=s[i];
                        flag=1;     //若可以,flag置1
                    }
                }
                m2=e[m];
                if(flag){
                    n--;      //因为继续举办了一个活动,所以将继续举办的活动从数组删除
                    for(int i=m;i<n;i++){
                        s[i]=s[i+1];
                        e[i]=e[i+1];
                    }    //删除完毕
                }
            }
    }
    printf("%d",sum);      //输出所用会场数总和
    return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值