关于会场安排问题
关于这个问题我的设计思路就是先找一个最早开始的活动占一个会场,然后去查找这个会场还能否继续举办其他活动(即活动举办完后在未举行的活动中查找有没有符合时间关系的),找的这个活动应该是离刚举办完的活动时间关系最近的一个,这样一直找下去,直到这个会场不能再继续举办活动,再新立一个会场从头开始找最早开始的活动。注意一点就是凡是举办过的活动都会在数组中删除,直到最后数组为空,输出所用会场总数。
问题描述:
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数)。
算法设计
对于K个待安排的活动,计算使用最少会场的时间表。
输入输出
input.txt
5
1 23
12 28
25 35
27 80
36 50
output.txt
3
#include <stdio.h>
int main()
{
int n,m,m1,m2;
scanf("%d",&n);
int s[n],e[n];
int sum=0; //用来记录总和
int flag;
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]); //输入各活动的起始时间
scanf("%d",&e[i]); //输入各活动的终止时间
}
while(n>0){
sum++; //会场使用数+1
m1 = 1000;
m2 = 1000;
m = 0;
for(int i=0;i<n;i++){ //先找出一个最早开始的活动
if(m1>s[i]){
m1 = s[i];
m2 = e[i];
m = i;
}
}
n--; //记录完之后将在数组中删除这个活动
for(int i=m;i<n;i++){
s[i]=s[i+1];
e[i]=e[i+1];
} //删除完毕
flag=1;
while(flag&&n>0){ //在此进行判断一个会场最多可以举办多少个活动
flag=0;
m1=1000;
for(int i=0;i<n;i++){
if(s[i]>m2&&s[i]<m1){ //查询该会场一个活动结束后是否可以继续举办下一个活动,即时间关系,找离得最近的
m=i;
m1=s[i];
flag=1; //若可以,flag置1
}
}
m2=e[m];
if(flag){
n--; //因为继续举办了一个活动,所以将继续举办的活动从数组删除
for(int i=m;i<n;i++){
s[i]=s[i+1];
e[i]=e[i+1];
} //删除完毕
}
}
}
printf("%d",sum); //输出所用会场数总和
return 0;
}