贪心算法---任务调度

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

 

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

算法思路:

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

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

3)对步骤2进行循环

代码实现思路:

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

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

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

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

输入:

 输出:

 

#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;
}

学习参考:https://blog.csdn.net/qq_43914374/article/details/105125453?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163376820216780366565471%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163376820216780366565471&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-105125453.first_rank_v2_pc_rank_v29&utm_term=%E6%95%99%E5%AE%A4%E5%88%86%E9%85%8D&spm=1018.2226.3001.4187

https://blog.csdn.net/zdadan/article/details/79150603?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163376826816780255289117%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163376826816780255289117&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-5-79150603.first_rank_v2_pc_rank_v29&utm_term=%E6%95%99%E5%AE%A4%E5%88%86%E9%85%8Dc%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187

 

posted @ 2021-10-09 21:16  无敌小金刚  阅读(777)  评论(0)    收藏  举报