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

活动安排问题
一个由需要使用某一资源的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;
}

你可能感兴趣的:(算法,活动)