我正在尝试解决此问题:http://acm.tju.edu.cn/toj/showp2886.html
我尝试了一些解决方案,我将解释其中的两个。请注意,两者都假设成本(位置)是凸函数,这意味着它向中间减小(实际上它朝向中间(供应点)),并且图形看起来或多或少像U形。
找到最左边和最右边的供应点位置,其成本(位置)< = M.在找到最小值和最大值后,我试着看看是否可以将间隔设置得更大(自餐厅以来)不必完全放在供应点上。)这是一个很好的解决方案,但计算最后一点需要很多。它在M非常大的测试中失败,并且以最小的成本存在很少的供应点。复杂性:O(NlogN)+ O(M)。下面的解决方案因为时间限制超过,但我尝试了另一个我在O(1)中计算我可以向两个方向走多少而且得到错误答案。
由于函数是凸的,我可以使用三元搜索来找到最小值。如果最小值小于M,则我二进制搜索函数的下限和上限(意味着M)。复杂性:O(NlogM),因为对于每个O(logM),我用O(N)来计算成本。
这是我尝试过的,我仍然得到“错误答案”,所以我需要一些帮助,因为这让我疯狂。
问题在规范中并不是很清楚(或者至少我认为是这样),因为当我第一次阅读它时,我认为成本不是从所有供应点计算出来的,而是从最近的那个计算出来的。这个例子清除了这一点。 另外,我不知道我的成本(位置)函数假设是否真的是真的。但是我尝试过很多例子,看起来似乎是这样。
感谢。任何帮助表示赞赏。 :d
答案 0 :(得分:1)
列表中两个连续供应商位置之间的最小目标值必须出现在两个供应商位置之一。要看到这一点,请考虑两个供应商位置之间没有供应商位置,其位置相差超过1.假设左侧供应商位置的目标值小于或等于右侧供应商位置。然后每次从左侧供应商位置开始向右移动1步,目标函数上升(弱,它可能保持不变),因为目标函数的变化量与向右移动1步时相同两个连续供应商地点之间的时间。因此,您需要计算的唯一事项是有多少供应商位置提供相同的全局最小值。这些将发生在连续的段(供应商位置给出的端点),并且每个段的端点之间的所有位置也将给出相同的全局最小值。
请注意,根据我的分析,有可能有两个非连续的段,它们提供相同的全局最小目标值。如果是这样,那么你的功能可能不会凸起,这可能是你当前尝试中遇到困难的根源。
通过从左到右的处理,可以在N(N)时间内为N个供应商计算每个供应商位置的目标值。