3240. 小香浓范诺编码

单点时限: 2.0 sec

内存限制: 256 MB

给定一组信元符号出现的频率,按照从小到大的顺序排好,将信源符号分化为两大组,使两组的频率和近于相同,并各赋予一个二元码符号01。只要组内有两个或两个以上符号,就以同样的方法重复以上分组,以此确定这些符号的连续编码数字。依次下去,直至每一组只剩下一个信源符号为止,按照信元所在分组的赋值顺序组合成为该信元的编码,分组过程中不调整信元次序。

例如,输入四个信元的频次分别为2,4,8,16,先分为:一组248和另一组16(差值为2,最小),给排在前面的一组赋0,后面的一组赋1,第二组为一个信元,16只剩下一个信元,所以它的编码就是1,对第一组继续按照和接近相同分组,分为第一组为24,第二组为8(差值为2,最小),第一组赋值0,第二组赋值1,因此8的编码是01,再对第一组分组,第一组2,第二组4(差值为2,最小),第一组赋0,第二组赋1;因此,2的编码为:0004的编码为001

注意:如果输入四个信元的频次分别为1,2,3,3,那么1+2=3,3+3=61+2+3=63=3两组差值相等,我们以12为一组,3,3为一组为准。如果存在两个分割方式使得两个组差值相等,那么以第一个组元素个数少为准。

输入格式

1 行:整数 T (1T10) 为测试数据组数。

每组测试数据按如下格式输入:

第一行:一个整数n,表示输入信元个,1<n200

第二行:n个整数,从小到大排序的,整数为int类型范围。

输出格式

对于每组测试数据,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后按照输入的顺序输出相应频次和信元编码,两个数之间用 : 分隔,每行一个。

样例

Input
3
2
0 1
4
2 4 8 16
6
20 20 20 20 20 20
Output
case #0:
0:0
1:1
case #1:
2:000
4:001
8:01
16:1
case #2:
20:00
20:010
20:011
20:10
20:110
20:111

102 人解决,127 人已尝试。

139 份提交通过,共有 428 份提交。

3.3 EMB 奖励。

创建: 7 年,11 月前.

修改: 6 年,7 月前.

最后提交: 1 月前.

来源: 2017 编程实训第二次机考