我正在尝试解决一个问题,在24小时的时间内,每个分成15分钟。找出所有至少1小时的间隔,不会与任何人发生冲突。我为N个用户提供了数据,其中每个用户都有一个他们忙着的间隔列表
我在想,如果我最初保持1个24小时的间隔,我可以将这一个间隔分成许多小间隔,因为我扫描了对所述用户来说很忙的间隔。有没有更好的方法呢?
编辑: 输入:
[(30,10),(70,20)] //从早上7:30到上午10点,下午5:30到晚上10:30忙碌
[(0,30),(40,10),(90,6)] //忙碌从上午12点到上午7点30分,上午10点到下午12点半,以及晚上10点半到12点
输出:
如果我们搜索两个用户都有空的1小时时间,则应该返回 [(50,4),(54,4),(58,4),(62,4),(66,4)]
答案 0 :(得分:2)
按天给出块数(96个块,每个块15分钟),创建一个包含96个布尔值的数组,用于跟踪繁忙的块(将忙块标记为True
),然后迭代标记繁忙块的用户计划。最后,再次遍历数组以将所有单元格合并为False
。
例如,给定以下输入数据:
2
30 10
70 20
3
0 30
40 10
90 6
以下代码将输出至少1小时的块,这两个块对两个用户都是免费的:
#!/usr/bin/env python
# There are 96 blocks
NUM_TIME_BLOCKS = 96
# At the begining they are all free
timeBlocks = [False] * NUM_TIME_BLOCKS
with open('input.in') as times:
for line in times:
numBlocks = int(line)
for n in range(0, numBlocks):
# Get the starting time and its duration
(start, length) = map(int, times.next().split())
# Mark every 15 min block as busy
for i in range(start, start + length):
timeBlocks[i] = True
i = 0
while i < NUM_TIME_BLOCKS:
if timeBlocks[i] == False:
for j in range(i, NUM_TIME_BLOCKS):
if timeBlocks[j]:
break
# We only care about blocks 1 hour long
if j > 4:
print '({0}, {1})'.format(i, j)
i = j
i += 1
您可以将此作为基础。此外,如果要将答案拆分为一个小时的几个块,则必须调整算法。希望能帮助到你。