会场安排问题
作者:互联网
1.对贪心算法的理解
用贪心法在求解问题时,总是做出在当前看来是最好的选择;因为不从考虑整体最优的情况,所以一般得出的是局部最优解。
2.汽车加油问题
2.1 问题描述
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的 贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个 顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小 会场数。)
输入格式:
第一行有 1 个正整数k,表示有 k个待安排的活动。 接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间 以 0 点开始的分钟计。
输出格式:
输出最少会场数。
输入样例:
5
1 23
12 28
25 35
27 80
36 50
输出样例:
在这里给出相应的输出。例如:
3
2.2 问题分析
与一个会场安排最多活动数不同,此题要求所有活动必须被安排需要的最少会场。
排除最晚开始,最早结束,时间最短等方法(并非最优)选择最早开始的策略。
2.3 贪心策略
根据活动的开始时间排序,优先安排活动时间开始最早的活动
sche[]数组记录每个活动是否已经被安排
每次循环按照最早开始时间的策略安排一个会场,直到所有的活动都得到安排
2.4代码
#include <iostream>
#include <algorithm>
using namespace std;
struct ACT { //活动结构体
int start; //开始时间
int end;//结束时间
}acts[100];
bool cmp(ACT act1, ACT act2) { //开始时间早的活动排在前面
return act1.start < act2.start;
}
int main() {
int k;
int i, j;
cin >> k;
bool sche[100];//记录每个活动是否已经安排
for (i = 0; i < k; i++) {
cin >> acts[i].start>> acts[i].end;
}
sort(acts, acts + k, cmp);
for(i = 0; i < k; i++) {
sche[i] = false;
}
//每次循环按照最早开始时间的策略安排一个会场,直到所有的活动都得到安排
int left = k; //待安排活动数
int count = 0; //需要的会场数
while (left) {
count++;
int end = 0;
for (j = 0; j < k; j++) {
if (!sche[j] && acts[j].start >= end) {
end = acts[j].end;
sche[j] = true;
left--;
}
}
}
cout << count << endl;
return 0;
}
3.结对情况
本次实验题我和张琪打出了两种版本,两个人交换比较,最汇总结。
贪心法求解问题没有动态规划法那么复杂,循环的边界条件很重要。
标签:acts,end,int,安排,问题,会场,活动 来源: https://www.cnblogs.com/mwany/p/13974396.html