会场安排问题(贪心算法)
-
问题描述
题目来源:王晓东《算法设计与分析》
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小
会场数。)
输入格式:
第一行有 1 个正整数k,表示有 k个待安排的活动。
接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间以 0 点开始的分钟计。
输出格式:
输出最少会场数。 -
问题分析
将会议开始时间和结束时间都排序,这时候会议的开始时间和结束时间都是升序的。遍历会议的开始时间,如果有会议i的开始时间小于某会议j的结束时间,那么该会议i一定是需要开辟一个新会场的,而当会议i开始时间大于某会议j的结束时间,该会议i可以利用之前的会场,而不需要开辟新的会场。 -
第一个AC代码
在这里插入代码片
#include <bits/stdc++.h>
using namespace std;
int beginn[10005];//存开始时间
int endd[10005];//存结束时间
int main()
{
int n;//总活动个数
int cnt = 0;//需要的最少会场数
cin >> n;
for (int i = 0; i < n; i++)
cin >> beginn[i] >> endd[i];
//按开始时间升序排列
sort(beginn, beginn + n);
//按结束时间升序排列
sort(endd, endd + n);
int j = 0;
for (int i = 0; i < n; i++)
{
if (beginn[i] < endd[j])
cnt++;
else
j++;
}
cout << cnt;
return 0;
}
4、 第二个AC代码
正常思路代码
5、第三个AC代码
高级,用STL,AC代码