合并果子

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

合并果子

牛客地址:

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、首先需要知道xxxyyy的体力消耗是相互独立的,所以计算的时候可以将二维的问题,简化为两个以为一维问题,因此后续介绍主要与xxx方向的计算为例;

2、首先需要明确最优策略为一定是将所有其他果子直接合并到其中一个果堆中,证明如下:

​ 假设存在某一策略需要将两个果堆iiijjj合并,然后移动到第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=xixjw

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值