假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。
输入:第1行有一个正整数k,表示有k个待安排的活动。接下来的k行中,每行两个正整数,分别表示k个待安排活动的开始时间和结束时间
输出:所用的最少会场数。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。
//输入:第1行有一个正整数k,表示有k个待安排的活动。
//接下来的k行中,每行两个正整数,分别表示k个待安排活动的开始时间和结束时间
//输出:所用的最少会场数。
int main(){
int k,i,j,t,c;
printf("请输入待安排活动数:");
scanf("%d",&k); //活动数0
printf("请输入待安排活动的开始时间和结束时间:\n");
int huodong[k][2];//活动开始/结束时间
for(i=0;i<k;i++)
{
scanf("%d %d",&huodong[i][0],&huodong[i][1]);
}
for(i=0;i<k-1;i++) //冒泡排序按开始时间对活动进行排序
{
c=0; //早停标志变量
for(j=0;j<k-1-i;j++)
{
if(huodong[j][0]>huodong[j+1][0])
{
c=1;
t=huodong[j][0];
huodong[j][0]=huodong[j+1][0];
huodong[j+1][0]=t;
t=huodong[j][1];
huodong[j][1]=huodong[j+1][1];
huodong[j+1][1]=t;
}
}
if(c==0)
break;
}
int huichang[k];//最多k个会场,数组储存结束时间
int top=0; //使用的会场数
for(i=0;i<k;i++)//所有活动
{
c=0; //活动是否安排标志变量
for(j=0;j<top;j++)//对所有会场
{
//会场当前活动结束时间比活动开始时间早
if(huichang[j]<huodong[i][0])
{
//在该会场安排活动
c=1;
//更改当前会场活动结束时间
huichang[j]=huodong[i][1];
break;//不用看其余会场
}
}
if(c==0)//如果活动还没有被安排
{
//新开会场供活动使用
huichang[top]=huodong[i][1];
top++;
}
}
printf("使用会场数:%d 个",top);
return 0;
}