我正在尝试解决以下问题,这是编程竞赛的一部分:
问题ID:CIELLAND
主厨Ciel与她的餐厅一起开辟了一个新的岛屿。在岛上,Ciel打算建造N家餐厅,第i家餐厅的坐标为(xi,yi)。此外,Ciel将创建K路,其位置尚未确定。每条道路必须是一条无限长的直线。
设di是第i个餐厅和距离第i个餐厅最近的道路之间的距离。 Ciel想要创建K路,最小化max(d1,d2,...,dN)。你的任务是计算max的最小值(d1,d2,...,dN)。
关于我应该如何处理它的任何想法?此外,比赛社论已经出版(http://www.codechef.com/wiki/march-2012-cook-problem-editorials),但我无法理解解决方案。
非常感谢有关所采用方法的任何帮助。
答案 0 :(得分:1)
在较高的层面上,他们正在重新制定问题,以便更容易解决。通过在下面的光线中进行投射,它们限制了可能考虑的线数。
问题A:有N个圈子。第i个圆圈的中心是(xi, yi)和所有圆圈都有半径R.我们可以绘制X线 任何圆与至少一条线相交。什么是最小的 X?
为了进一步解释,让我们用语言重新解释问题A:餐馆是规则的坚持者,并且有一条规则规定所有餐馆必须就道路的最大距离达成一致 - 这将是R.圆圈创建由餐厅和R代表一条线需要交叉以满足这一要求的地方。新问题要求最少的道路数量。
如果在K路下无法做到这一点,那么就必须改变一些事情。我们不能根据原始问题添加道路,但我们可以修改R.这是二进制搜索的用武之地,但我们必须首先解决问题A.
现在,我们考虑解决问题A.首先,线路可以 限于两个圆的共同切线。因为如果一条线 与一些(至少2个)圆相交,我们可以移动这样的线 移动的线与相同的圆相交,以及移动的线 是常见的切线之一。如果一条线相交少于2个圆圈, 它没用(但要注意N = 1的情况)。最多有4个 与两个圆圈共同切线的线,所以我们最多考虑2个 * N *(N-1)行。
重要的是这个,我们需要找到与多个圆相交的线。每个圆圈最多需要考虑四条线,检查源代码是否实现。
下一个重要的步骤是动态编程,它找到覆盖所有圆圈的最小行数。 “掩码”是一个位掩码,表示在考虑每一行时已经击中了哪些圆圈。
这解决了问题,但现在我们必须转换回来。记得R?我们现在可以二进制搜索以找到最小R,使得X <= K.就我对问题A的重新制定而言,它是所有餐厅将同意的最小距离,并且仍然由道路提供服务
希望这有助于解决棘手但有趣的问题。
答案 1 :(得分:0)
你应该能够解决它,因为k意味着聚类问题。最初种子有一堆线。然后迭代地将点分配更新为线和最优给定点。