问题:有时候会出现多个活动,但是活动场地只有一个,需要我们用一个场地尽可能的安排最多的活动,由于活动开始和结束时间不一致,怎样安排才能使得尽可能多的活动被安排呢?

 

贪心算法---任务调度_.net

图中:开始结束分别为开始时间与结束时间

算法思路:

1)结束时间最早的为第一个

2)在剩余中选择最早的结束时间,只要他的开始时间晚于上一个结束时间就可以

3)对步骤2进行循环

代码实现思路:

1)设置4个数组,start数组:活动开始时间;finish数组:活动结束时间;order数组:记录活动的编号;join数组:记录活动是否举行;

2)按照活动的结束时间对活动进行排序(start数组与order数组也跟着排序)

3)判断下一个活动开始的时间是否晚于上一个csd动结束的时间,如果成立,活动举行,join数组对相应的值设为1;

4)遍历join数组,如果为1,则输出对应的order数组的值

输入:

贪心算法---任务调度_代码实现_02

 输出:

贪心算法---任务调度_代码实现_03

 




#include<stdio.h>

void sort(int* start,int* finish,int* order,int n){//对活动进行排序
int temp;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(finish[j]>finish[j+1]){
temp=finish[j];
finish[j]=finish[j+1];
finish[j+1]=temp;

temp=start[j];
start[j]=start[j+1];
start[j+1]=temp;

temp=order[j];
order[j]=order[j+1];
order[j+1]=temp;
}else if(finish[j]==finish[j+1]){//两个活动的结束时间相同
if(start[j]>start[j+1]){
temp=finish[j];
finish[j]=finish[j+1];
finish[j+1]=temp;

temp=start[j];
start[j]=start[j+1];
start[j+1]=temp;

temp=order[j];
order[j]=order[j+1];
order[j+1]=temp;
}
}
}
}
}
int main(void){
int start[20];
int finish[20];
int order[20];
int join[20];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&start[i],&finish[i]);
order[i]=i+1;
}
sort(start,finish,order,n);
int end=0;
int i=0;
while(i<n){
if(start[i]>=end){//判断活动的开始时间是否晚于上一个活动的结束时间
join[i]=1;
end=finish[i];
}
i++;
}
for(int k=0;k<n;k++){//举行的活动(已经排好顺序)输出
if(join[k]==1){
if(k==0){
printf("%d",order[k]);
}else{
printf("%d",order[k]);
}
}
}
return 0;
}