我被分配了这个问题我必须解决:
某个游泳池有很多带导游的活动。因此,使用规则非常严格:
空闲时段只有一分钟。使用空闲插槽后,我们必须等待至少x秒才能使用另一个插槽。您有免费插槽列表,并且您希望游泳至少m
分钟。允许它的最大x
是多少?
输入
输入包含几种情况。每个案例都以分钟数m
和广告位n
开头,后跟n
三元组H:M:S
,表示有一条免费通道一分钟从H:M:S
开始。假设2 ≤ m ≤ n ≤ 1000
,小时在00:00:00
和23: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
答案 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]