题目来源:王晓东《算法设计与分析》
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的 贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个 顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小 会场数。)
输入格式:
第一行有 1 个正整数k,表示有 k个待安排的活动。 接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间 以 0 点开始的分钟计。
输出格式:
输出最少会场数。
输入样例:
5
1 23
12 28
25 35
27 80
36 50
输出样例:
在这里给出相应的输出。例如:
3
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[100], b[100];
void shu(int k, int start[], int end[]) {
int count = 0;
int j = 0;
for (int i = 0; i < k; i++) {
if (start[i] < end[j]) {
count++; //增加一个会场
}
else {
j++; //可以使用前面的会场
}
}
cout << count;
}
int main() {
int k;
cin >> k;
for (int i = 0; i < k; i++) {
cin >> a[i] >> b[i];
}
sort(a, a + k); //先排好序
sort(b, b + k);
shu(k, a, b);
}
运行错误的:
#include<iostream>
using namespace std;
int color[100];//表示各顶点的着色情况
int aa[100][100] = { 0 };//图中各边的代价
int k;
int Ok(int i) { //判断顶点i的着色是否发生冲突
for (int j = 0; j < k; j++) {
if (aa[i][j] == 1 && color[i] == color[j]) { //两点中间有连线,并且颜色相同
return 0;
}
else {
return 1;
}
}
}
void ColorGraph() {
int k = 0;
int flag = 1; //图中未着色的顶点为1
while (flag == 1) {
k++; //取下一种颜色
flag = 0;
for (int i = 0; i < k; i++) {
if (color[i] == 0) {
color[i] = k; //顶点i涂上颜色k
if (!Ok(i)) { //发生冲突,取消涂色
color[i] = 0;
flag = 1;
}
}
}
}
cout << k;
}
int main() {
int m[100], n[100];
cin >> k;
for (int i = 0; i < k; i++) {
cin >> m[i] >> n[i];
}
for (int i = 0; i < k; i++) {
for (int j = i; j < k; j++) {
if (n[i] > m[j]) {
aa[i][j] = 1;
aa[j][i] = 1;
}
}
}
ColorGraph();
}