合并果子
牛客地址:
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、首先需要知道xxx与yyy的体力消耗是相互独立的,所以计算的时候可以将二维的问题,简化为两个以为一维问题,因此后续介绍主要与xxx方向的计算为例;
2、首先需要明确最优策略为一定是将所有其他果子直接合并到其中一个果堆中,证明如下:
假设存在某一策略需要将两个果堆iii,jjj合并,然后移动到第kkk个果堆,令第iii个果堆的xxx坐标为xix_ixi,重量为wiw_iwi,第jjj个果堆为xjx_jxj,重量为wjw_jwj,第kkk个果堆的xxx坐标为xkx_kxk,重量为wkw_kwk。此时需要消耗的体力S1S_1S1为:
S1=∣xi−xj∣wi+(wi+wj)∣xk−xj∣S_1=|x_i-x_j|w_i+(w_i+w_j)|x_k-x_j|S1=∣xi−xj∣w

这篇博客讨论了如何在二维平面上将果子合并成一堆,以最小化消耗的体力。博主通过分析证明了最优策略是每次都合并到某个果堆,并提出了两种解法:一种是基于排序和动态规划的状态方程1,时间复杂度为O(nlog(n));另一种是类似计数排序的状态方程2,时间复杂度为O(n)。样例输入、输出和数据范围也给出,便于读者理解问题。

1774

被折叠的 条评论
为什么被折叠?



