活动安排问题(C++)
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct activity
{
int index;
int s;
int f;
} ;
int cmp1 ( activity a, activity b)
{
return a. f< b. f;
}
int cmp2 ( activity a, activity b)
{
return a. s< b. s;
}
int MINf ( activity a[ ] , int B[ ] )
{
sort ( a, a+ 11 , cmp1) ;
int e= 1 ;
int j= 1 ;
B[ j- 1 ] = 1 ;
for ( int i= j+ 1 ; i<= 11 ; i++ )
{
if ( a[ j- 1 ] . f<= a[ i- 1 ] . s)
{
j= i;
e++ ;
B[ j- 1 ] = 1 ;
}
}
return e;
}
int MINs ( activity a[ ] , int B[ ] )
{
sort ( a, a+ 11 , cmp2) ;
int e= 1 ;
int j= 1 ;
B[ j- 1 ] = 1 ;
for ( int i= j+ 1 ; i<= 11 ; i++ )
if ( a[ j- 1 ] . f<= a[ i- 1 ] . s)
{
j= i;
e++ ;
B[ j- 1 ] = 1 ;
}
return e;
}
int main ( )
{
int init_s[ ] = { 1 , 3 , 0 , 5 , 3 , 5 , 6 , 8 , 8 , 2 , 12 } ;
int init_f[ ] = { 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 } ;
activity a[ 11 ] ;
for ( int i= 0 ; i< 11 ; i++ )
{
a[ i] . index= i+ 1 ;
a[ i] . s= init_s[ i] ;
a[ i] . f= init_f[ i] ;
}
int e= 1 ;
int B1[ 11 ] , B2[ 11 ] ;
for ( int k= 0 ; k< 11 ; k++ )
{
B1[ k] = - 1 ;
B2[ k] = - 1 ;
}
int e1= MINf ( a, B1) ;
int e2= MINs ( a, B2) ;
for ( int k= 0 ; k< 11 ; k++ )
{
printf ( "%2d\t%2d\n" , B1[ k] , B2[ k] ) ;
}
printf ( "e1=%d,e2=%d\n" , e1, e2) ;
if ( e1> e2)
{
sort ( a, a+ 11 , cmp1) ;
printf ( "最大安排场数:%d\n" , e1) ;
for ( int k= 0 ; k< 11 ; k++ )
if ( B1[ k] == 1 )
printf ( "%d\n" , a[ k] . index) ;
}
else
{
printf ( "最大安排场数:%d\n" , e2) ;
for ( int k= 0 ; k< 11 ; k++ )
if ( B2[ k] == 1 )
printf ( "%d\n" , a[ k] . index) ;
}
}