贪心算法(C语言)
一、会议安排问题
1.1 问题
(1)对于每个会议i,起始时间bi和结束时间ei,且bi<ei
(2)[bi,ei]与[bj,ej]不相交,则会议i和会议j相容,bi≥ej或bj≥ei
(3)目标:在有限的时间内,尽可能多地安排会议
1.2 分析
选择最早结束的会议
1.3 实现
(1)初始化:按结束时间递增排序
(2)选中第一个具有最早结束时间的会议,用last记录时间
(3)挑剩下的,若i的开始时间>last,则与回忆i与已挑会议相容
代码实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include<iostream> //包含输入输出流 #include<algorithm> //包含算法库 using namespace std; typedef struct Meet { int beg; //会议开始时间 int end; //会议结束时间 int num; //会议编号 }Meet; /*回忆结束时间升序排列*/ bool cmp(Meet x,Meet y) { return x.beg < y.beg; } int main() { /*初始化10个会议*/ Meet meets[10] = { {3,6,1},{2,4,2},{5,7,3}, {2,6,4},{5,9,5},{3,8,6}, {8,11,7},{6,10,8},{8,12,9}, {12,14,10}, }; /*调用sort函数对meets数组进行排序,排序规划为cmp*/ sort(meets,meets+10,cmp); int ans = 1; /*初始化last为meets[0].end,表示上一个安排的会议的结束时间*/ int last = meets[0].end; cout << "选择第" << meets[0].num << "个会议" << endl; /*遍历会议*/ for ( int i=1;i<10;++i) { if (meets[i].beg >= last) { ans++; last = meets[i].end; //更新最后一个会议的结束时间 cout << "选择第" << meets[i].num << "个会议" << endl; } } cout << "最多可以安排" << ans << "个会议" << endl; system ( "pause" ); //暂停程序运行,等待用户输入任意键继续 return 1; } |
二、多机调度题
1.1 问题
(1)设有n个独立的作业(1,2,……,n),由m台相同的机器(M1,M2,……,Mm)进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分
(2)多级调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成
1.2 分析
(1)贪心算法求解多机调度问题的贪心策略:最长处理时间的作业优先
(2)即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间
1.3 实现
代码实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include<iostream> #include<algorithm> using namespace std; typedef struct Work { int hour; //工作所需时间 int num; //工作编号 }Work; bool cmp(Work x,Work y) { //按照工作时间的降序排序 return x.hour > y.hour; } //选出最先空闲的机器,即返回空闲时间最早的机器的索引 int minR( int rear[], int m) { int min = rear[0]; int t = 0; for ( int i=1;i<m;i++) { if (rear[i]<min) { min = rear[i]; t = i; } } return t; } //主函数 int main() { const int m = 3; //机器数量 const int n = 7; //工作数量 int rear[m] = {0}; //记录每台机器的完成时间 int arr[m][n] = {0}; //记录每台机器执行的工作 /*声明结构体数组 works[n],表示每个工作的时间和编号*/ Work works[n] = { {2,1},{14,2},{4,3}, {16,4},{6,5},{5,6}, {3,7}, }; sort(works, works + n,cmp); //对工作按照所需时间进行排序 for ( int i = 0; i < n; i++) { int index = minR(rear, m); //选出最先空闲的机器 rear[index] += works[i].hour; //更新该机器的完成时间 arr[index][works[i].num - 1] = 1; //在对应机器的任务记录中标记该工作 } for ( int i=0;i<m;i++) { cout << "第" << (i+1) << "台机器的任务有:" ; for ( int j=0;j<n;j++) { if (arr[i][j] == 1) { cout << (j+1) << "," ; } } cout << "\n 总时间为:" << rear[i] <<endl; } system ( "pause" ); //暂停程序运行,等待用户输入任意键继续 return 1; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现