【发布时间】:2014-02-07 14:21:05
【问题描述】:
我输入了一些比赛(比如说马拉松)中的排名,其值在[0, N) 范围内。有几个子竞赛(例如,基于年龄、性别等)仅对子集 team 感兴趣,而另一个子集 not_eligible 不符合资格。
我正在寻找一种有效的算法(最好根据标准库编写),它将更新排名。示例:
auto team = std::vector<int>{ 1, 2, 9, 13 };
auto not_eligible = std::vector<int>{ 8, 10, 12 };
std::vector<int> result;
// some algorithm
assert(result == std::vector<int>{ 1, 2, 8, 10 });
因为只有 1 名低于 #9 的选手(即 #8)不合格,所以 #9 的排名减少 1,并且因为有 3 名不合格的完赛者(即 #8、#10 和 #12)在#13 之前,该排名从#13 到#10 更新3 为该特定子竞赛。
注意 8 和 10 是 result 的一部分,但不是因为它们是从 non_eligible 合并而来的,而是因为它们的排名是由 team 的 9 和 13 占用的。
如何使用标准算法的组合来实现上述目标?我希望能够在 O(N + M) 复杂性中实现长度为 N 和 M 的输入范围(例如通过 5 腿 std::transform)。
更新:我也对逆向算法感兴趣:给定子赛的排名,在添加之前不合格的参赛者时,如何更新子赛中的参赛者的排名?
【问题讨论】:
-
@close voter:请提出澄清问题,以便我详细说明。我认为这个问题已经足够明确了!
-
请注意,您的示例有点误导,因为结果
8, 10在not_eligible内部。您可以将not_eligible更改为{5, 11, 12}。 -
@Jarod42 tnx,我没有注意到,但总的来说这是算法的一部分。更新了一个注释,tnx!
标签: c++ algorithm c++11 stl ranking