贪婪活动选择算法

我正在尝试解决此问题:https://open.kattis.com/problems/classrooms

  

在校园中有?教室和?建议的活动   被分配一个场地。每个拟议的活动都有明确的起点   时间??和结束时间??。任何此类活动都应进行   在其中一间教室。 ?任何一个教室都足够大   举行任何拟议的活动,每个教室可以举行   任何时候最多一项活动。建议的任何活动都不能参加   同时放在同一间教室。即使两个提议   活动暂时重叠(一项活动的结束时间等于   另一个活动的开始时间),则无法将其分配给   同一间教室。

     

提议的活动太多,可能还不够   教室举行所有活动。希望有尽可能多的   活动越好。最多可以建议多少个活动   分配到教室吗?

     

输入第一行包含两个正整数?和?   (1≤?≤?≤200000),代表拟议活动的数量和   教室的数量。

     

以下?行每行包含两个正整数:?th   这些?行中的一行包含contains和??(1≤??≤??≤109),   指示拟议活动的开始时间和结束时间

我想出了一个贪婪的解决方案,可以按结束时间对类进行排序,然后检查是否有可能根据贪婪条件将类分配给活动

'''
https://open.kattis.com/problems/classrooms
'''

from collections import deque

n,k = map(int,input().split())
classes = []
for _ in range(n):
    (start,end) = map(int,input().split())
    classes.append((start,end))

classes.sort(key=lambda x: x[1])
queue = deque()
count = 0
for (start,end) in classes:
    if queue and queue[0] < start:
        queue.popleft()
        queue.append(end)
        count += 1
    elif len(queue) < k:
        count += 1
        queue.append(end)
print(count)

但是,这在一些(隐藏的)测试用例上失败了。

有人能指出我正确的方向吗?解决这个问题的正确方法是什么?

nwpu_guy 回答:贪婪活动选择算法

这是当前过程如何失败的一个例子。

8个活动,2个教室:

  a   b   c
 --- --- ------
 d     e
--- -------
  --- ---- ---
   f   g   h

queue   count
 d       1
 d a     2
 f (no)
 a b     3
 b g     4
 e (no)
 g h     5
 c (no)

使用顶部和底部轨道,我们可以清楚地看到结果可能是6。

以下是相应的输入:

8 2
2 4
6 8
10 15
1 3
5 11
3 5
7 10
12 14

我认为您探索的一条不错的途径是,除了有k个存储桶(而不是只有一个)外,我们希望继续选择创建下一个最小结束时间。

本文链接:https://www.f2er.com/2944749.html

大家都在问