【发布时间】:2020-10-20 12:15:16
【问题描述】:
我有一些现实生活中的墙,其特点是两个高度(最左边和最右边的高度)。
例如
I I I I
I I I I I
I I I I I I
I_____I I_____I I____I
第一个有最左边的高度hl=4,最右边的高度hr=3,第二个有hl=4和hr=4等等。
鉴于hl 和hr,我现在的任务是找到体积最小的墙以达到hl 和hr。所以 (a) 只允许降低墙两侧的高度,但不能增加,(b) 损失的体积应该是最小的。
在第一种方法中,我使用最小高度hMin=std::min(hl,hr) 将问题降低到一个高度。通过这样做,我可以用“墙”填充地图并使用hMin 作为键,然后使用lower_bound 搜索max(hl,hr) 来获得解决方案。
现在考虑到两个高度的最佳解决方案,我在构建严格的弱顺序时遇到了各种麻烦。到目前为止,我尝试将键扩展到第二个高度,使用自定义的 less 并等效地使用 lower_bound。 我的自定义 less 看起来有点像:
struct KeyLess
{
bool operator(Key const&x, Key const&y) const
{
if ((x.hl + roundOff < y.hl ) && (x.hr+ roundOff < y.hr))
return true;
if ((y.hl + roundOff < x.hl ) && (y.hr+ roundOff < x.hr))
return false;
return false;
}
};
但对于x.hl> y.hl 和x.hr < y.hr 或这些类型在视觉上显然存在问题
I I
I I I I
I I I I I I
I_____I I_____I I____I
并且没有给出严格的弱排序afaik。
如果能为我的问题构建一个 less 运算符或向我展示另一种解决此问题的方法,我将不胜感激。
例子
I I I I I I
I I I I I I I I
I I I I I I I I
I I I I I I I I I
I_____I I_____I I____I I_____I I_____I
给定 hl=3 和 hr=5 它应该返回第三个(hl=4 和 hr=5)。
只要我能找到解决方案,墙壁在地图中保存的顺序本身并不相关(但我认为这也是我在这里找到有意义的顺序的问题)。
【问题讨论】:
-
不相关:
operator<有效地做:return ((x.hl + roundOff < y.hl ) && (x.hr+ roundOff < y.hr));所以你可以用它替换函数的主体。您能举一些例子吗?您希望按什么顺序对结果进行排序? -
我不明白你的问题描述。但这听起来像是一个组合问题,而不是排序问题(即不能简单地通过排序来解决)。
-
请查看更新后的问题(包括示例)。谢谢
-
您拥有的是部分订单,而不是全订单。
-
如果顺序无关紧要,为什么不使用 unordered_set 或 std::tie?