2 回答
TA贡献1848条经验 获得超2个赞
据我了解这个问题,要求是根据分数对学生进行排序,但还有一个额外的限制是要保留一个区域内学生的相对顺序。
鉴于问题中列出的示例之一的输入数据,
Region1:
A, 11.5
B, 8.5
C, 10.0
Region2:
D, 12.0
E, 9.0
F, 9.5
仅按分数排序会得出以下结果:DACFEB。
然而,关于在一个区域内保持相对排序的约束需要以下部分排序A < B < C 和 D < E < F。
OP 将此特定示例的解决方案称为 DAEBCF。在对该问题的评论中,我为此示例提出了另外两种可能的解决方案:DABCEF 和 DAEFBC。我没有看到任何标准可以让我们决定哪些可能的解决方案是正确的。因此,该问题受到了不足的约束。人们可以争论这些解决方案中的哪一个比其他解决方案更可取,但这样做会引入新的约束,而这些约束在原始问题中并不明显。
鉴于有多个解决方案满足问题中的所有标准,这意味着该域中的值没有完全排序。此外,鉴于正确的比较器必须对其域的值进行总排序,因此不可能为该域编写适当的比较器。
当然,可以编写一个正确的比较器,它有一些行为,并且会更喜欢这些可能的解决方案之一而不是其他解决方案。这样做将隐含地实施不属于问题陈述的附加约束。事实上,Vincent van der Weele似乎已经这样做了。语句“下一个空白点必须由其中一个区域的排名最高的剩余元素填充。哪个?得分最高的那个”引入了附加约束。它导致了 OP 建议的排序 DAEBCF。虽然这是明智的,但它必然是“正确”的排序。
另一种算法可能如下。1)从一个空的结果列表开始,并按排名顺序维护来自每个地区的学生列表。2) 找出剩下的得分最高的学生。3) 取该学生和同一区域内排名较高的学生,并将它们附加到结果中,保持相对顺序。4) 重复直到没有学生留下。
将此算法应用于示例输入会产生 DABCEF。这是明智的,但方式不同。同样,我们不知道这是否是“正确”的答案。
要么是编程竞赛中的问题一开始就没有明确说明,要么是竞赛的问题陈述与 Stack Overflow 上 OP 的问题之间丢失了一些信息。
TA贡献1946条经验 获得超3个赞
您的比较器不正确。您基本上说,如果学生来自同一地区,则按排名排序,否则按分数排序。但事实并非如此,如本例所示:
Region1:
A, 11.5
B, 8.5
C, 10.0
Region2:
D, 12.0
E, 9.0
F, 9.5
结果是
D, 12.0
A, 11.5
E, 9.0
B, 8.5
C, 10.0
F, 9.5
即,得分为 9.0 的 E 排在得分为 10.0 的 C 之前,即使他们来自不同的地区。
一个更简单的算法,它确实有效:
逐个元素填充结果。下一个空位必须由其中一个区域中排名最高的剩余元素填充。哪一个?得分最高的那个。因此,从其区域中删除该元素,将其添加到结果中,然后重复直到完成。
添加回答
举报