查找符合要求的间隔

时间:2015-03-18 23:24:23

标签: algorithm

我正在尝试解决一个问题,在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)]

1 个答案:

答案 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

您可以将此作为基础。此外,如果要将答案拆分为一个小时的几个块,则必须调整算法。希望能帮助到你。