2020.5.16普及组模拟赛 T4 100分做法

题目大意:

有一段长度为 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+pipj
如果我们将 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+pipj

我们可以继续合并成

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+(ljpj)

我们要使答案最大也就是要使 ( l j − p j ) (l_j-p_j) (ljpj) ( p i + l i ) (p_i+l_i) (pi+li)最大。
所以我们就可以用一个变量来维护 ( l j − p j ) (l_j-p_j) (ljpj)使 ( l j − p j ) (l_j-p_j) (ljpj)最大,然后 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()+lipi)
这道题的核心解体思路就是

( l j − p j ) (l_j-p_j) (ljpj)& ( 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]);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值