装球:设有N个盒子(N足够大,可装入任何数量的球),分别编号1,2,…。同时有K个小球(K>0),今将K个小球装入到盒子中去,装入规则如下:
(1) 第一个盒子不能为空。
(2) 装入必须严格按递增的顺序进行。
例如,当K=8,N=6装入方法有:1,2,5 或1,3,4
(3)在满足上面的两个条件下,要求有球的盒子尽可能多。
(4)装完之后,相邻盒子中球个数差的绝对值之和为最小(未装的盒子不计)。
如上例中:
装入法1,2,5 则差的绝对值之和为:2-1+5-2=4
装入法1,3,4 则差的绝对值之和为:3-1+4-3=3
[程序要求]:给出K(K表示小球个数)之后,求出满足上述四个条件的装入方法。
[算法描述]:设计一个数组A:ARRAY[1..N] OF INTEGER,用数组元素代表盒子然后依次装入小球。
PROGRAM EXP3(INPUT,OUTPUT);
CONST N=20;
VAR I,J,K,L:INTEGER;
A :ARRAY[1..N] OF INTEGER;
BEGIN
READLN(k);
fillchar(a,sizeof(a),0)
J:=1;
WHILE j<=k DO
BEGIN
A(J):=J; k:=k-j :J:=J+1
END;
L:=j-1;
WHILE k>0 DO
BEGIN
a[l]:=a[l]+1 :K:=K-1:L:=L-1
END;
FOR I:=1 TO j-1 DO
WRITE(A[I]:4)
END.