推销员
这里如果按照距离来考虑就太复杂了,于是转化对象,考虑客户

证明:
假设我们选的疲劳值最大的前X个的最远的一个的距离为\(S_{1}\),那么可以知道,一定不会存在一个更优的方案,使得这个方案的最远的距离比\(S_{1}\)要小
所以更优的方案的最远的距离肯定要比\(S_{1}\)大,假设我们选择了一个比\(S_{1}\)远的,距离为\(S_{2}\)的住户作为这个方案的最远的住户,我们直接考虑在这个情形下的最优状态是什么。肯定是选择\(X-1\)个住户,这些住户的距离小于\(S_{2}\),疲劳值尽可能大
那么肯定选择疲劳值前\(X-1\)大的住户,就是最开始的方案去掉疲劳值最小的住户
插一句,这一道题目在做的时候,我从样例感觉出来了一个结论,就是\(X\)的决策一定包含\(X-1\)的决策,考虑多增加哪一个住户就可以了
从部分题解来看,这个想法也是正确的,但是不知道怎么证明
update 2024.7.21
哎,想到了转换对象,将客户排序了,但是没有想到这么做啊。。。
update 2025.1.7
三个月没打代码了居然做出来了,我服了
心路历程:显然是转换对象,然后考虑客户,按照\(A_i\)排序,也是把距离忽略掉了,直接考虑\(X\)比较大的时候包含了最远的一个客户,于是显然就是选前\(X\)个客户;再去想\(X\)比较小的时候,这个时候肯定就是舍弃掉一些客户换成距离更大的客户,不难想到上面的做法
update 2026.2.18
忽略掉排序其实是简化问题思想。非常常见的简化问题思想就是考虑数据规模更小的时候怎么做然后扩展到所有数据点。另一种方式就是让限制变得更简单(但是数据规模不变),比如这里就是去掉了求解过程当中的一个量;其他情况可能是去除一个限制条件
当然,我把“\(X\)的决策一定包含\(X-1\)的决策”给证明出来了
实际上我证明的是:随着\(X\)的增大,最优决策中最远的客户一定会更远,而不是更近。这个结论观察样例可以想到
证明:
设\(s_i\)表示距离,\(a_{i,j}\)表示距离\(s_i\)处的第\(j\)个客户的疲劳值。假设\(s_i\)处的客户按照疲劳值从大到小排序
可以发现一个显然的结论:当\(X\)确定了之后,我们如果再确定决策中最远的客户的距离(设为\(s_i\)),那么我们的选择就是\(a_{i,1}\)以及\(\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\)中最大的\(X-1\)个
设\(X\)的最优决策中最远的客户的距离是\(s_i\),最优决策是\(\{a_{i,1}\}\)+\(\text{Top}_{X-1}\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\),\(X+1\)的决策中最远的客户的距离是\(s_j\),最优决策是\(\{a_{j,1}\}\)+\(\text{Top}_X\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{j,2},a_{j,3},...\}\),其中\(j<i\),也就是\(s_j<s_i\)
假设\(\min(\text{Top}_X\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{j,2},a_{j,3},...\})=a_{k,l}\),那么\(a_{k,l}∉\text{Top}_{X-1}\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\),这是因为\(\text{Top}_{X-1}\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{j,2},a_{j,3},...\}\subset\text{Top}_{X-1}\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\),如果\(a_{k,l}∈\text{Top}_{X-1}\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\),那么在去除了\(\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\)中的一些数后变成\(\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{j,2},a_{j,3},...\}\),\(a_{k,l}\)的排名(按照疲劳值从大到小)只增不减,这就与\(\min(\text{Top}_X\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{j,2},a_{j,3},...\})=a_{k,l}\)矛盾了
由于\(a_{k,l}∉\text{Top}_{X-1}\{a_{1,1},a_{1,2},...,a_{2,1},a_{2,2},...,a_{i,2},a_{i,3},...\}\),所以我们把\(X\)的最佳决策中加上\(a_{k,l}\),那么得到的决策比现在的\(X+1\)的最优决策更优,这就矛盾了
所以证毕
证明了这个结论,显然就证明了“\(X\)的决策一定包含\(X-1\)的决策”
那么接下来的操作就很简单了,假设现在最远的客户的距离为\(s_i\),只需要判断\(s_i\)以及前面的还没有被选择的客户中疲劳值最大的与\(s_i\)之后的客户中疲劳值(加上距离的贡献)最大的之间的相对大小就好了
可以用优先队列维护还没有被选择的客户,后缀最大值维护\(s_i\)之后的客户
时间复杂度\(O(n\log n)\)

浙公网安备 33010602011771号