学习过程总结,希望各位多多指教,我加以改正
会议安排算法思路
根据贪心策略
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.熟悉链表的创建和操作,基本的排序和增删
来源:CSDN
作者:李杨在路上
链接:https://blog.csdn.net/stephenli300203/article/details/104798188