2132: 最优前缀编码

内存限制:256 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:2

题目描述

因为某种原因,小Y最近常将自己写的信编码来防止别人偷看。

所谓编码,即给信息内所有的字符以唯一的“编码”,来代替原字符传输或存储。 为了保证信息能够被正确的还原,小Y规定,编码必须符合一定的规则。

假设小Y的信息基于字符集α,要用K个字符来为其编码,定义它的前缀编码S为一个集合,它包含了N个不同字符串,与字符集中的元素一一对应,并满足以下两个条件:

1.每一个字符串仅包含字符 '0','1', ...。

2.对于集合中任意两个字符串x和y,x不是y的前缀。 当一个编码为前缀编码时,它所表示的内容能够被快速唯一地还原,常见的等长编码即为前缀编码。

假定字符集α中的每个元素出现概率相等,那么前缀编码S的代价可以被定义为字符集中所有元素编码字符的代价之和。 因为小Y要写很多信,而他写每个字符需要的代价都是不一样的(比划数或者其他不同)。为了方便,他需要知道如何为字符集编码,才能做到代价最小。

输入

输入第一行包含两个整数N,K,分别表示字符集大小,编码字符个数。 第二行包含K个正整数,即K个字符各自的代价。

输出

输出仅一行,包含一个整数minCost,表示前缀编码的最小代价。

样例输入 复制

3 2 
1 4

样例输出 复制

11

提示

样例1说明:

最优的前缀编码为{"00","01","1"}。

 输入样例2:

3 3

1 3 5

输出样例2:

 9

样例2说明:

有两种前缀编码代价最小:{"0","1","2"},{"00","01","1"}。

输入样例3:

500 10

1 2 3 4 5 6 7 8 9 10

输出样例3:

4732

数据规模:

对于30%的数据 N <= 10,K <= 5。

对于50%的数据 K <= 10。

对于100%的数据 N <= 500,K <= 50,每个字符的代价小于等于100。