这是一些编程竞赛的一个问题(我不确切知道它属于哪个编程竞赛,我在一年前见过)。问题如下:
有N座建筑物,每座都有自己的高度(不一定是唯一的)
{h1,h2,h3,...,hn}
我们必须使所有高度相同的建筑物都说h。
允许的操作是:
与每座建筑物相关的成本是要删除/增加单位高度。假设c(i)是为建筑物移除/增加单位高度的成本。各自的费用如下:
{c1,c2,c3,...,cn}
假设我们有足够的高度(单位),我们必须找到使所有建筑物都具有相同高度所需的最低成本。
输入:
第一行将指定N个建筑物数。 (1 输入的第二行将用于建筑物的高度。
{h1,h2,h3,...,hn}
输入的第三行将给出成本数组
{c1,c2,c3.....,cn}
输出
输出将仅仅是所需的最低成本。
输入样例:
3
2 1 3
10 1000 1
样本输出
12
说明:将所有建筑物的高度设为1,因此费用为
10 *(2-1)+ 1000 *(1-1)+ 1 *(3-1),即12。
我知道暴力破解方法是O(n ^ 2)。
我认为的暴力破解方法如下:
无论常见的高度h是多少,都必须来自
{h1,h2,h3,....,hn}
即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)表示成本,如果我们使所有高度大于ith建筑物的建筑物等于SORTED ARRAY P中第ith建筑物的高度,即Cost_of_decrease(i)如果我们使建筑物P(1 ),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)建筑物的总成本为:
Cost_of_Increase(i)+ Cost_of_decrease(i)。
一旦我们在所有建筑物中都拥有了这一点,只需检查成本最小的那一个,这就是答案。
希望能帮助到你 !
关于algorithm - 以最低的成本找到建筑物的共同高度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12559882/