二进制搜索算法使值最大化

时间:2016-11-20 14:37:50

标签: c++ algorithm binary-search greedy

我被分配了这个问题我必须解决:

某个游泳池有很多带导游的活动。因此,使用规则非常严格:

空闲时段只有一分钟。使用空闲插槽后,我们必须等待至少x秒才能使用另一个插槽。您有免费插槽列表,并且您希望游泳至少m分钟。允许它的最大x是多少?

输入

输入包含几种情况。每个案例都以分钟数m和广告位n开头,后跟n三元组H:M:S,表示有一条免费通道一分钟从H:M:S开始。假设2 ≤ m ≤ n ≤ 1000,小时在00:00:0023:59:00之间,并且时间段之间没有重叠。最后一个条目标有m = n = 0的特殊情况。

输出

对于每种情况,请打印允许总浴时间为m或更长时间的最大x

在变量x上使用二进制搜索最大化它的可能实现是什么?

问题的输出:

input: 
4 8 
00:10:40 00:35:30 01:00:00 01:55:00 02:10:00 03:15:00 12:00:20 23:59:00 
output: x = 11000

1 个答案:

答案 0 :(得分:2)

这根本不需要任何搜索。将列表从空闲时间段转换为时间段之间的等待时间列表,以秒为单位(考虑到您游泳一分钟):

waiting_time[]

for i in [1, length(time_slots))
   waiting_time[i - 1] = delta_minutes(time_slots[i - 1], time_slots[i]) * 60 - 60

对等待时间列表进行排序

sortDesc(waiting_time)

由于您必须等待m - 1次,因此必须选择x,以使至少x等待时间至少相等。由于我们正在搜索最大x,因此最小的等待时间必须与x完全一样长,这是我们数组中的m - 1元素。

全部放在一起:

minX(input[], m):
     waiting_time[]

     for i in [1, length(input)):
         waiting_time[i - 1] = delta_minutes(time_slots[i - 1], time_slots[i]) * 60 - 60

     sortDesc(waiting_time)

     return waiting_time[m - 1]