我正在尝试解决这个问题:http ://acm.tju.edu.cn/toj/showp2886.html
我尝试了一些解决方案,我将解释其中的两个。请注意,两者都假设成本(位置)是一个凸函数,这意味着它向中间递减(实际上是向中间值(供应点)的某处),并且图表看起来或多或少像 U 形。
找到cost(position) <= M的最左边和最右边的补给点位置。找到最小值和最大值后,我试着看看能不能把间隔弄大一点(因为餐厅不一定是地方正好在一个供应点上)。这是一个很好的解决方案,但需要非常多的时间来计算最后一位。它在 M 非常大且供应点很少且成本最低的测试中失败。复杂度:O(NlogN) + O(M)。下面的这个解决方案超出了时间限制,但我尝试了另一个解决方案,我在 O(1) 中计算我可以在两个方向上走多少,我得到了错误的答案。
由于函数是凸函数,我可以使用三元搜索来找到最小值。如果最小值小于 M,则二分查找函数的下界和上界(即 M)。复杂性:O(NlogM),因为对于每个 O(logM),我都会计算 O(N) 中的成本。
这是我尝试过的,但我仍然得到“错误答案”,所以我需要一些帮助,因为这让我发疯。
这个问题在规格中并不是很清楚(或者至少我是这么认为的),因为当我第一次阅读它时,我不认为成本是从所有供应点计算的,而是从最近的供应点计算的。该示例清除了这一点。另外,我不知道我的成本(位置)函数是凸的假设是否真的正确。但是我尝试了很多例子,看起来确实如此。
谢谢。任何帮助表示赞赏。:D