我正在尝试解决此问题: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)
但是,这在一些(隐藏的)测试用例上失败了。
有人能指出我正确的方向吗?解决这个问题的正确方法是什么?
答案 0 :(得分:2)
这是当前过程如何失败的一个例子。
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个存储桶(而不是只有一个)外,我们希望继续选择创建下一个最小结束时间。