【发布时间】:2017-08-31 05:43:47
【问题描述】:
给出了一系列 k 块 (k1, k2, ..., ki)。每个块从位置 ai 开始,到位置 bi 结束,其高度为 1。块连续放置。如果该块与另一个块重叠,则它被附加在其顶部。我的任务是计算最高的积木塔。 我创建了一个时间复杂度约为 O(n^2) 的算法,但我知道使用 skiplist 有一个更快的解决方案。
#include <iostream>
struct Brick
{
int begin;
int end;
int height = 1;
};
bool DoOverlap(Brick a, Brick b)
{
return (a.end > b.begin && a.begin < b.end)
}
int theHighest(Brick bricks[], int n)
{
int height = 1;
for (size_t i = 1; i < n; i++)
{
for (size_t j = 0; j < i; j++)
{
if (bricks[i].height <= bricks[j].height && DoOverlap(bricks[i], bricks[j]))
{
bricks[i].height = bricks[j].height + 1;
if (bricks[i].height > height)
height = bricks[i].height;
}
}
}
return height;
}
【问题讨论】:
-
你有什么问题?你的代码在哪里?
-
你能分享你创建的算法吗?
-
ai , bi 的范围是多少?
-
我添加了一个代码。 ai、bi 的范围不受限制,例如 (5,10)、(6,12)。我没有提到每个位置都是自然数,请原谅可能的误解。
标签: algorithm