贪心算法(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与已挑会议相容
代码实现如下:
#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 实现
代码实现如下:
#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;
}

浙公网安备 33010602011771号