题目大意:
有一段长度为 l e n len len的街道上还有 k k k条小街道,然后每一条小街道的末尾都有一间房子,每条小街在主线大街的 P i P_i Pi 处分支, 小街的长度为 L i L_i Li,然后要我们求最远的两个房子之间的距离是多少。
解题思路:
我们可以发现第 i i i到第 j j j个房子的距离为 l i + l j + ∣ p i − p j ∣ l_i+l_j+|p_i-p_j| li+lj+∣pi−pj∣
如果我们将 l l l排序后我们就可以把绝对值去掉变成
d i s ( i , j ) = l i + l j + p i − p j dis(i,j)=l_i+l_j+p_i-p_j dis(i,j)=li+lj+pi−pj。
我们可以继续合并成
d i s ( i , j ) = p i + l i + ( l j − p j ) dis(i,j)=p_i+l_i+(l_j-p_j) dis(i,j)=pi+li+(lj−pj)。
我们要使答案最大也就是要使 ( l j − p j ) (l_j-p_j) (lj−pj)和 ( p i + l i ) (p_i+l_i) (pi+li)最大。
所以我们就可以用一个变量来维护 ( l j − p j ) (l_j-p_j) (lj−pj)使 ( l j − p j ) (l_j-p_j) (lj−pj)最大,然后 m a x max max就行了。
a n s w e r = m a x ( f ( 维 护 变 量 ) + l i − p i ) answer = max(f(维护变量)+l_i-p_i) answer=max(f(维护变量)+li−pi)。
这道题的核心解体思路就是
( l j − p j ) (l_j-p_j) (lj−pj)& ( p i + l i ) (p_i+l_i) (pi+li)最大。
温馨提示:这道题不能够用两个循环分别求出,因为两个数据是要一起用的。
f[1]=b[1]-a[1];f[2]=0;
for (int i=2;i<=k;i++){
f[2]=max(f[2],f[1]+a[i]+b[i]);
f[1]=max(f[1],b[i]-a[i]);
}