题目传送门:P2672 [NOIP2015 普及组] 推销员
前言:本文面向所有初学者,所以节奏比较缓慢。
标签:贪心
目录:分析,证明,细节处理
简单概括题意,本题推销员阿明,要给住在某街的N个用户推销,走一米会增加1的疲劳值,第i家距离路口 s i s_i si 米(可能会有重复的 s i s_i si )给第 i i i 家推销会增加 a i a_i ai 。全部推销完,还要原路返回。现在,依次向 X X X 用户推销,对于不同的 X X X ,阿明想知道最大疲劳值。
S t e p Step Step O n e One One
分析:既然想知道最大疲劳值,就有可能是去尽可能疲劳值大的人家,和远的人家,那么如何平衡这两个最优呢?这就是本题的关键。
我们不妨优先选择去疲劳值大的人家,所以先进行排序。当我们已经决策完第 X X X家的时候,这并不一定是最优解,因为我们有可能可以通过去更远的人家从而使得疲劳值总和大过前者。那么我们是否能找到一种关于这种情况的贪心结论呢?
可以。答案是先存储答案,再判断将第 X X X位舍去,去到最远(指距离和疲劳值综合)的点,将这两个答案进行比较,大者为答案,然而无论去到哪一个点,都是不存在后效性的,所以放心大胆的做就可以了。
S t e p Step Step T w o Two Two
证明:如何证明上述结论是正确的?请思考,当我们将第 X X X位舍去,去选择一个最远的点,此刻我们已经享用了这个最远的点的双倍距离的增益,当我们想舍去第 X − 1 X-1 X−1位从而让疲劳值总和更大时,由于我们已经选择了最远的点,距离已经存过了,所以这一步对我们的贡献只是从一个大疲劳值变成了一个小疲劳值,显然是不优的。
为了方便理解,这里进行举例。
第零步:输入
5
1 2 3 5 4
5 4 3 1 2
第一步:排序
5
1 2 3 4 5
5 4 3 2 1
第二步:枚举 X X X
-
X = 1 X=1 X=1, A n s 1 Ans1 Ans1为直接选择最大疲劳值: 5 5 5,随后加上最大距离的二倍即 1 × 2 = 2 1 \times 2=2 1×2=2 , A n s 1 = 5 + 2 = 7 Ans1=5+2=7 Ans1=5+2=7 , A