我的输入由一些比赛中的排名组成(比如马拉松比赛),其值在[0,N]范围内.有几个子竞赛(例如,基于年龄,性别等),这些竞赛仅对子集团队感兴趣,而另一个子集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,因为在#13之前有3个不合格的终结者(即#8,#10和#12) ,对于该特定的子竞赛,该等级从#13更新为#10到#10.
注8和10是结果的一部分,但不是因为它们是从不合格的合并,而是因为他们的排名是由团队的9和13.
如何使用标准算法的组合实现上述目标?我希望能够以O(N M)复杂度对长度为N和M的输入范围(例如通过5腿std ::变换)进行此操作.
更新:我也对逆算法感兴趣:给定子竞赛的排名,如何在添加以前不合格的参与者时更新子测试中竞争者的等级?
最佳答案 利用现有算法并没有明显的方法;你最好采用示例代码进行合并并进行调整:
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt update_ranks(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first)
{
typename std::iterator_traits<InputIt1>::value_type adjust = {};
while (first1 != last1) {
if (first2 != last2 && *first2 < *first1) {
++adjust;
++first2;
} else {
*d_first = *first1 - adjust;
++first1;
++d_first;
}
}
return d_first;
}
对于反向,再次适应合并应该起作用.