这题可用哈夫曼树做,可简短时间,但用普通做法也可。 这样的话关键就是怎么求最小的情况,一开始以为是从大到小排序,每次取最大的数加进去就好,这是错的。。 把一块木板据成N块不好想的话,那么把这个过程反过来:把N块木板拼成一块,每拼一次所需代价是两块木板长度之和。这样就是很明显的哈夫曼树了。 每次从现有的木板中选取最短的两块木板,拼在一起变成新的一块后放回去,重复这个过程直到只剩一块木板。 用最小堆实现以上操作就不会超时。 普通做法 代码: #include<stdio.h> |
这题可用哈夫曼树做,可简短时间,但用普通做法也可。 这样的话关键就是怎么求最小的情况,一开始以为是从大到小排序,每次取最大的数加进去就好,这是错的。。 把一块木板据成N块不好想的话,那么把这个过程反过来:把N块木板拼成一块,每拼一次所需代价是两块木板长度之和。这样就是很明显的哈夫曼树了。 每次从现有的木板中选取最短的两块木板,拼在一起变成新的一块后放回去,重复这个过程直到只剩一块木板。 用最小堆实现以上操作就不会超时。 普通做法 代码: #include<stdio.h> |