贪心算法——活动安排问题

活动安排问题
一个由需要使用某一资源的n个活动组成的集合S = {1, 2, ... , n},该资源一次只能被一个活动占用。每个活动i有个开始时间s[i]和结束时间f[i],且s[i] <= f[i]。一旦被选择,活动i就占据半开时间区间[s[i], f[i])。如果[s[i], f[j])与[s[i], f[j])互不重叠,则称活动i和j是兼容的。活动安排问题就是要选择一个由互相兼容的问题组成的最大集合。

ActivitySelectorMain.c

#include  < stdio.h >

void  GreedyActivitySelector( int  n,  int   * s,  int   * f,  int   * A);
void  PrintActivity( int  n,  int   * s,  int   * f,  int   * A);

/*
 * n:活动个数
 * s:活动开始时间
 * f:活动结束时间
 * 假设输入的活动按结束时间递增序排列:f[1] <= f[2] <= ... <= f[n]
 * A:记录所选择的集合
 
*/

void  GreedyActivitySelector( int  n,  int   * s,  int   * f,  int   * A)
{
    
int i, j;
    
    A[
0= 1;
    j 
= 0;
    
for(i = 1; i < n; i++)
    
{
        
if(s[i] >= f[j])
        
{
            A[i] 
= 1;
            j 
= i;
        }

    }

}


void  PrintActivity( int  n,  int   * s,  int   * f,  int   * A)
{
    
int i;
    
    
for(i = 0; i < n; i++)
    
{
        
if(A[i])
            printf(
" %d %d-->%d", i, s[i], f[i]);
    }

}


int  main( int  argc,  char   ** argv)
{
    
int s[] = {130535688212};
    
int f[] = {4567891011121314};
    
int A[11= {0, };
    
int n;
    
    n 
= 11;
    GreedyActivitySelector(n, s, f, A);
    PrintActivity(n, s, f, A);
    
    
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值