这是一些编程竞赛中的一个问题(我不确切知道它属于哪个编程竞赛,我在一年前看到它).问题如下:
有N栋建筑,每栋都有自己的高度(不一定是唯一的)
{h1,h2,h3,...,hn}
Run Code Online (Sandbox Code Playgroud)
我们必须使所有相同高度的建筑物都说h.
允许的操作是:
每个建筑物都有相关费用来移除/增加单位高度.假设c(i)是移除/增加建筑物单位高度的成本.各自的费用如下:
{c1,c2,c3,...,cn}
Run Code Online (Sandbox Code Playgroud)
假设我们有足够的高度(单位),我们必须找到使所有建筑物具有相同高度所需的最低成本.
输入:第一行将指定N建筑物的数量.(1 <= N <= 100000).第二条输入线将用于建筑物的高度.
{h1,h2,h3,...,hn}
Run Code Online (Sandbox Code Playgroud)
第三行输入将给出成本数组
{c1,c2,c3.....,cn}
Run Code Online (Sandbox Code Playgroud)
产量
输出将只是所需的最低成本.
样本输入:
3
2 1 3
10 1000 1
Run Code Online (Sandbox Code Playgroud)
样本输出
12
Run Code Online (Sandbox Code Playgroud)
说明:将所有建筑物的高度设为1,因此费用为10*(2-1)+ 1000*(1-1)+ 1*(3-1),即12.
我知道蛮力方法是O(n ^ 2).
我认为的蛮力方法如下:
无论常见的高度是多少,它都必须来自
{h1,h2,h3,....,hn}
Run Code Online (Sandbox Code Playgroud)
即h必须等于h(i)中的任何一个.现在检查每个h(i)我可以用O(n ^ 2)计算答案.
是否可以更快地完成它?
O(n log(n)) 解决方案:
令 h(i) 表示第 i 座建筑物的高度,让 c(i) 表示第 i 座建筑物的成本。
现在使用这个递归:
Cost_of_Increase(i) = Cost_of_Increase(i-1) + ( h(i)-h(i-1) )*( 第 P(i-1) 栋建筑到第 P(n) 栋建筑的成本总和 )
注意,在上面的递归中,i和i-1的顺序是根据P的顺序,即排序顺序。
现在让 Cost_of_decrease(i) 表示如果我们使所有高度大于第 i 个建筑物的建筑物等于排序数组 P 中第 i 个建筑物的高度的成本,即如果我们使建筑物 P(1) 的 Cost_of_decrease(i) ), P(2), ... P(i-2), P(i-1) 等于第 P(i) 栋建筑物的高度。
为此,请使用此递归:
Cost_of_decrease(i) = Cost_of_decrease(i+1) + ( h(i+1)-h(i) )*( 第 P(1) 栋建筑到第 P(i-1) 栋建筑的成本总和 )
因此,使所有建筑物的高度等于第 P(i) 栋建筑物的总成本为:
增加成本 (i) + 减少成本 (i)。
一旦我们对所有建筑物有了这个,只需检查哪一栋的成本最小,这就是答案。
希望能帮助到你 !