合并果子
牛客地址:
https://www.nowcoder.com/practice/854e7118eb08464ab8ce7a0bca8b276c?tpId=182&tab=answerKey
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了N堆。果园是一个二维平面,第i堆果子的位置为(Xi,Yi),重量为Wi。多多决定把所有的果子合成一堆。每一次合并,多多可以消耗Wi (|Xi- Xj|+|Yi- Yj |)的体力把第i堆果子合并到第j堆。可以看出,所有的果子经过N-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。请你求出将所有果子合并成一堆消耗的总体力最少是多少。
样例输入
4
2 1 1
1 2 3
3 1 2
2 4 2
样例输出
14
数据范围
20% N≤10
60% N≤1000
100% N≤100000,Xi,Yi,Wi≤100000
解法一
1、首先需要知道 x x x与 y y y的体力消耗是相互独立的,所以计算的时候可以将二维的问题,简化为两个以为一维问题,因此后续介绍主要与 x x x方向的计算为例;
2、首先需要明确最优策略为一定是将所有其他果子直接合并到其中一个果堆中,证明如下:
假设存在某一策略需要将两个果堆 i i i, j j j合并,然后移动到第 k k k个果堆,令第 i i i个果堆的 x x x坐标为 x i x_i xi,重量为 w i w_i wi,第 j j j个果堆为 x j x_j xj,重量为 w j w_j wj,第 k k k个果堆的 x x x坐标为 x k x_k xk,重量为 w k w_k wk。此时需要消耗的体力 S 1 S_1 S1为:
S 1 = ∣ x i − x j ∣ w i + ( w i + w j ) ∣ x k − x j ∣ S_1=|x_i-x_j|w_i+(w_i+w_j)|x_k-x_j| S1=∣xi−x