有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行(最大兼容活动子集)。
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
s[i] | 1 | 3 | 0 | 5 | 3 | 5 | 6 | 8 |
f[i] | 4 | 5 | 6 | 7 | 9 | 9 | 10 | 11 |
a[i] | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
选取贪心策略是每次选取结束时间最早的活动。
#include<stdio.h>
//将各个活动按结束时间递增排序
void sort(int s[],int f[],int n){
int a,b;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(f[i]>f[j]){
a=f[i]; f[i]=f[j]; f[j]=a;
b=s[i]; s[i]=s[j]; s[j]=b;
}
}
}
}
int activemanage(int s[],int f[],bool a[],int n){
a[0]=1;
int i;
int j=0,count=1;
for(i=1;i<n;i++){
if(s[i]>=f[j]){
a[i]=1; j=i; count++;
}else{
a[i]=0;
}
}
return count;
}
int main(){
int i,n;
int p;
int s[100],f[100];
bool a[100];
printf("输入工程数:\n");
scanf("%d",&n);
printf("请依次输入开始时间与结束时间:\n");
for(i=0;i<n;i++){
scanf("%d %d",&s[i],&f[i]);
}
sort(s,f,n);
p=activemanage(s,f,a,n);
printf("安排的工程个数为:%d\n",p);
printf("工程选取情况为:(0代表不选1代表选)\n");
for(i=0;i<n;i++){
printf("%d",a[i]);
}
printf("\n");
}