会议安排算法

限于喜欢 提交于 2020-03-16 17:54:54

学习过程总结,希望各位多多指教,我加以改正

会议安排算法思路

根据贪心策略
	1.每次选取开始时间最早的
	2.每次选取开会时间最短的
	由此得出选取结束时间最早的符合最优
因此安排程序流程
	1.将需要安排的会议按照结束时间递增排序
	2.选择最早结束的会议排在第一位,遍历数组,一次找到最接近上一场会议结束时间的会议添加到数组里面

代码

一,开始数据保存在数组里面

	struct Meeting {
		int MeetId;
		int StartTime;
		int EndTime;
	};
	int n;
	printf("请输入需要安排会议场次:\n");
	scanf_s("%d", &n);
	Meeting* meet = new Meeting[n];
	for (int i = 0;i < n;i++) {
		printf("第%d场:\n", i + 1);
		meet[i].MeetId = i + 1;
		printf("开始时间:");
		scanf_s("%d", &meet[i].StartTime);
		printf("结束时间:");
		scanf_s("%d", &meet[i].EndTime);
	}

二,将输入数据按照EndTime地递增排序

void SortMeet(Meeting meets[],int n) {
	Meeting meet;
	for (int i = 0;i < n;i++) {
		for (int j = i; j < n - i -1; j++) {
			if (meets[j].EndTime > meets[j + 1].EndTime) {
				meet = meets[j];
				meets[j] = meets[j + 1];
				meets[j + 1] = meet;
			}
		}
	}
}

这里用的是最基础的冒泡排序
三,

struct Meet {
	Meeting meet;
	int Length;
	Meet *pNext;
};
Meet *Find(Meeting *a,int n) {
	int j = 0;
	int length = 1;
	Meet *pHead,*p;
	pHead = new Meet;p = new Meet;
	pHead->pNext = p;
	p->meet.MeetId = a[0].MeetId;
	p->meet.StartTime = a[0].StartTime;
	p->meet.EndTime = a[0].EndTime;
	p->Length = length;
	pHead->Length = length;
	for (int i=0;i < n;i++) {
		if (a[i].StartTime > a[j].EndTime) {
			length++;
			p->pNext = new Meet;
			p->pNext->meet.MeetId = a[i].MeetId;
			p->pNext->meet.StartTime = a[i].StartTime;
			p->pNext->meet.EndTime = a[i].EndTime;
			p->pNext->Length = length;
			p = p->pNext;
			j = i;
			pHead->Length = length;
		}
	}
	return pHead;
}

这里由于想把安排后的会议信息保存起来,如果不想存会议信息,可以直接输出。
因为其不定长的原因,用了链表。头节点里面保存了安排会议的总个数。在这里插入图片描述
执行结果如上

难点:
1.初始化不定长的数组
可以使用malloc或new

	1.int* p = (int*)malloc(num);
	2.int* meet = new int[num];

2.熟悉链表的创建和操作,基本的排序和增删

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!