本文系博主原创,转载请注明出处:https://blog.youkuaiyun.com/coder_what/article/details/83833202
/*
会场安排问题:(贪心算法)
已知有n个活动(第一行),且开始时间和结束时间已知(后面几行),试求最少需要几个会场
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct
{
float begtime,endtime;//开始和结束时间
}TIME;
int comp(const TIME &s1,const TIME &s2)//自己定义的排序规则
{
return s1.endtime<s2.endtime;
}
TIME time[100000];
int n;
int Count();//计算需要几个教室
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%f%f",&time[i].begtime,&time[i].endtime);
getchar();
}
printf("%d",Count());
}
int Count()
{
int count=1,count_temp=1,j=0; //房间数和房间上一次的个数
TIME temp[100000];//其中有效字符的个数即为房间数
sort(time,time+n,comp); //结构体里的endtime进行排序
temp[j].begtime=time[0].begtime;
temp[j].endtime=time[0].endtime;
for(int i=1;i<n;i++) //整体遍历一遍
{
for(j=0;j<count_temp;) //time数组中的内容和存入temp数组(即占用房间)进行比较
{
if(time[i].begtime<temp[j].endtime)
{
j++; //这个不能写在下个if里面
if(j==count_temp) //如果在前面且遍历到temp的最后一个元素
{
temp[j].begtime=time[i].begtime;
temp[j].endtime=time[i].endtime;
count++; //说明房间数不够,重新开辟房间数且进行赋值
}
} //这个地方必须加大括号,不然里面的if会和下面的else进行错误匹配
else //如果在后面,则说明可以公用同一个房间
{
temp[j].begtime=time[i].begtime;
temp[j].endtime=time[i].endtime;
break;
}
}
count_temp=count;
}
return count;
}
1463

被折叠的 条评论
为什么被折叠?



