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

图中:开始结束分别为开始时间与结束时间
算法思路:
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

浙公网安备 33010602011771号