其他分享
首页 > 其他分享> > 会场安排问题

会场安排问题

作者:互联网

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