会场安排问题
题目描述
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。
设计一个有效的贪心算法进行安排
解题思路
1.对活动进行排序,开始时间越早排在越前面,如果两个活动时间相同,则结束时间越早的排在越前面
2.始时间最早和持续时间最短的优先安排会场,并记录会场号,
3.其余活动的开始时间大于或等于已安排活动的结束时间的安排在同一会场,
4.若某活动的开始时间小于已经安排了会场的活动的结束时间,则安排在另一会场,记录会场号,
5.依次循环,直到所有活动均被安排
具体代码实现
#include<stdio.h>
#include<stdlib.h>
void sort(int a[],int n){
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(a[i]>a[j]){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
int main(){
int n;
printf("请输入事件个数(n):");
scanf("%d",&n);
int *start=(int *)malloc(sizeof(int)*n);
int *end=(int *)malloc(sizeof(int)*n);
printf("请依次输入各事件的开始和结束时间:\n");
for (int i=0;i<n;i++)
scanf("%d%d",&start[i], &end[i]);
sort(start,n);
sort(end,n);
int j=0;
int sum=0; //会场个数
for(int i=0;i<n;i++){
if(start[i]<end[j])
sum++; //如果开始时间小于结束时间则另开辟一个会场
else
j++; //否则和下一个结束时间进行比较
}
printf("需要会场:%d",sum);
return 0;
}