【发布时间】:2021-03-22 06:28:17
【问题描述】:
最初给定一个时间间隔。每次,我们选择最大的间隔并将其分成两半。如果出现平局,则选择起点最低的区间。
例如 - [0,9] 第一次拆分 - P1 [0,4] 和 P2 [4,9]
第二次拆分: dist(P1) = 3 => 如果选择 P1,新的间隔将是 [0,2] 和 [2,4]。 dist(P2) = 4 => 如果选择 P2,则新区间为 [4, 6] 和 [6,9] 在这两种情况下,我们都必须创建距离为 1 的子区间。所以,这是平局。并且,我们选择 P1 作为 P1
[0,2], [2, 4], [4, 9]
第三次分裂: [0,2], [2, 4], [4,6], [6,9]
第四次分裂: 有一个平局,s0,被选中 [0,2] [0,1], [1,2], [2,4], [4,6], [6, 9]
第五分裂: [0,1], [1,2], [2,3], [3,4], [4,6], [6,9]
位居榜首的可能候选人:[4,6]
但是,我总是将 [1,2] 放在首位。
#include <iostream>
#include <queue>
using namespace std;
int main()
{
auto dist{ [](const auto & p) {
return p.second - p.first - 1;
} };
auto comp{
[&dist](const auto & p1, const auto & p2) {
if (abs(dist(p1) - dist(p2)) <= 1) {
return p1.first > p2.first;
}
return dist(p1) < dist(p2);
}
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> maxQ{comp};
maxQ.push({ 0, 9 }); // initial interval
for (int i{ 0 }; i < 5; ++i) {
auto ii{ maxQ.top() };
maxQ.pop();
int mid = (ii.first + ii.second) / 2;
maxQ.push({ ii.first, mid });
maxQ.push({ mid, ii.second });
}
while (!maxQ.empty()) {
auto& ii{ maxQ.top() };
cout << ii.first << " : " << ii.second << endl;
maxQ.pop();
}
}
我得到以下输出:
1 : 2
6 : 9
0 : 1
2 : 3
3 : 4
4 : 6
IMO,1 : 2 间隔不应位于顶部。有人可以在这里帮助我吗,为什么会这样。
【问题讨论】:
标签: c++