题意:

对若干正整数二元组\((x_i,t_i)\),求一个实数\(x_0\),使得\(max\{ t_i+|x_i-x_0|\}\)最小。n<=1e5。

思考:

​ 虽然问的是\(x_0\),但不妨对这个最小的最大值进行二分,也就是——对于当前mid,是否存在\(x_0\)使得任意\(t_i+|x_i-x_0|<=mid\)。对每个i对应的不等式,解得\(x_i+(mid-t_i)<=x_0<=x_i-(mid-t_i)\),记为\(l<=x_0<=r\)。如果\(x_0\)存在,那它便需要满足所有的不等式,我们把约束条件合并,得到\(l_{max}<=r_{min}\)。最后一次二分的\(l_{max}\)\(r_{min}\)(反正相差足够小)就是我们想要的解(因为随着mid越靠近最优结果,lr肯定越靠近一个值)。

官方题解和个人感悟:

​ 考虑当t均为0时,问题转换到坐标轴上,很显然无论\(x_0\)位于何处,离它最远的点要么是最左点,要么是最右点,我们取中心即可。当引入\(t_i\)后,我们便又多了一维坐标轴(表示\(t_i\)的值),所问距离也变成了平面上的曼哈顿距离,然后依旧是在原坐标轴上寻找\(x0\)

​ 对于二元组\((x_i,t_i)\),我们可以考虑将\(t_i\)“扳”回到原坐标轴上。比如当\(x_0\)\(x_i\)左边时,\(t_i\)应“扳”向右边,也就是把\(x_i\)向右移动\(t_i\)从而向上一段的特殊情况转换。如果“扳”向左边,那么其对结果的贡献显然会被“扳”向右边的值给隐匿掉(因为绝不会比“扳”向右边更优)。

也就是说,若一个个体在假定不同的解时有不同的状态,我们可以尝试将拆它所有状态拆分出来使之独立,满足这些状态最后只有一个会作出贡献,其余的会被隐匿掉。

如此一来,将所有二元组转换为\(x_i+t_i\)\(x_i-t_i\),取最大值和最小值的平均值,即解。

相关问题:

对若干整数\(x_i\),求一个实数\(x_0\),使得\(\sum |x_i-x_0|\)最小。

结论:最优的解就是这些数的中位数

证明:

​ 想象一数轴,任意找一个点,它左边有4个点,右边有2个点,把该点往左移动一点点,不要移动太多,以免碰到其他输入点。假设移动了d单位距离,则该点到左边4个点的距离各减少d,该点都右边2个点的距离各增加d,但总的来说,距离之和减少了2d。

​ 同理,该点的左边有2个点,右边有4个点时,类似,不过此时应该是向右移动。

​ 换句话说,只要该点的左右两边的输入点个数不一样多,就不是最优解。那什么情况下,左右点一样多呢?如果输入点有奇数个,则最优解应该是中间那个点即中位数。如果有偶数个,则可以位于最中间两个点的任意位置(还是中位数)。

原文地址:http://www.cnblogs.com/blover/p/16815958.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性