铁路/公共汽车站所需的最小平台数量——贪心法(C++)

铁路/公共汽车站所需的最小平台数量——贪心法

题目:给定到达火车站的所有列车的到达和出发时间,任务是找出火车站所需的最小站台数,以便没有列车等待。用两个数组,分别代表停靠的列车的到达和出发时间。 例:
Input:
arr[] = {9:00, 9:40, 9:50, 11:00, 15:00, 18:00}
dep[] = {9:10, 12:00, 11:20, 11:30, 19:00, 20:00}

Output: 3

Input:
arr[] = {9:00, 9:40}
dep[] = {9:10, 12:00}

Output: 1

算法思想
要用最少的平台让火车安全到达和离开,即让一个平台尽可能多的安全停靠火车。运用贪心算法,每次让一个平台尽可能多停靠火车,无法安全停靠所有火车时,再增加平台。解题思路如下:
1、定义一个lis数组,下标对应到站火车的序号,来标记该火车是否已经有平台停靠;
2、将一个平台尽可能多的停靠列车:遍历火车数组,每次比较该火车到达时间和上一辆火车的离开时间,若到达时间大于该站台上一辆离开的时间,则可停靠,更新离开时间;
3、若所有火车遍历完,还有火车没有平台停,则递归增加一个平台(num+1);
4、直到所有火车均有平台停靠,才输出平台数量。

代码
#include
using namespace std;
//num是平台数量,tem是该平台最后一辆列车离开时间
int time_separate(int arr[],int dep[],int num, int tem, int lis[])
{ int sum=0;
for (int k=0;k<6;k++){//遍历所有火车
if (lis[k] == 1){ //如果该列车k已经有平台停靠,那么考虑下一辆车是否能停靠
continue;
}
if (arr[k] >= tem){ //该列车k可以停靠该平台
tem = dep[k]; //tem更新为列车k的离开时间
lis[k] = 1; //lis[k]=1表示该列车k已经有平台停靠
}
}
for(int i=0;i<6;i++)
{
sum+=lis[i];
}
if (sum == 6){ //所有列车均有平台停靠
cout<<“需要的平台数量为:” <<endl;
cout<<num; //输出需要的平台数量
return 0;
}
else
{time_separate(arr,dep, num + 1, 0, lis); } //递归增加一个平台
}

int main()
{
int arr[6] = {900,940,950,1100,1500,1800};//900表示9:00
int dep[6] = {910,1200,1120,1130,1900,2000};
int lis[6]={};//lis数组下标对应到站火车序号
time_separate(arr,dep, 1, 0, lis);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值