【发布时间】:2020-11-14 02:14:05
【问题描述】:
我正在学习算法设计,我看到了这个问题:问题:我们有 n 个学生(从 1 到 n 编号)。学生需要分组进行课堂活动。每个学生都有自己小组中有多少学生的偏好。具体来说,学生 i 希望他们组中的学生人数在 x[i] 和 y[i] (含)之间。换句话说,如果组(那个学生 i 被分配到)有 G 个人,那么 x[i] ≤ G ≤ y[i] 必须成立。每个学生都必须被分配到一个小组(即使小组只有一名学生)。 给定 n 和 x[], y[],算法应该确定这是否可能。
以下是一些示例:
示例 1:n = 5, (x[], y[]) = { (1, 2), (1, 3), (2, 3), (2, 2), (3, 3) }。
我们可以将学生 1 和学生 4 分配到一个组(该组的人数为 2),将其他三个学生分配到另一个组。这样就可以满足大家的约束了。
示例 2:n = 5, (x[], y[]) = { (1, 2), (1, 2), (2, 3), (2, 2), (3, 3) }。
不可能满足学生 5 的约束,因为只有两个学生对 3 大小的小组“还行”(而学生 5 只希望小组中正好有 3 个学生)。
示例 3:n = 5, (x[], y[]) = { (1, 1), (2, 2), (2, 2), (2, 5), (2, 4) }。
学生 1 可以分配到一个独奏组。学生 2-5 可以被任意分配到两个大小为 2 的小组(因为每个人都可以在他们的小组中有 2 个学生)。因此,存在许多解决方案。
我的第一个想法是按照 y[i] 对数组进行排序,然后从第一个元素开始,根据 y[i] 的值将人分组。但是在示例 2 的情况下会发生什么?
我的第二个想法是按x[i]+y[i]对数组进行排序,由于y[i]大于x[i],我们可以从第一个元素开始,将人分组(但i认为第一个想法更好)
总的来说,我觉得这2个算法都不够用,我在找更足够的(如果有的话)
【问题讨论】:
-
有趣的问题,请问您是从哪里找到这个问题的?
-
@SerialLazer, apparently 来自 HackerRank,但我提供直接链接的请求从未得到回应。相关:stackoverflow.com/help/referencing
标签: java algorithm sorting dynamic-programming computer-science