贪心算法(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;
} 
posted @ 2023-11-03 21:22  Auion  阅读(98)  评论(0)    收藏  举报