源程序名 CHOP.??? (PAS,C,CPP)
可执行文件名 CHOP.EXE
输入文件名 CHOP.IN
输出文件名 CHOP.OUT
A先生有很多双筷子。确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的。这天,A先生家里来了K个客人,A先生留下他们吃晚饭。加上A先生,A夫人和他们的孩子小A,共K+3个人。每人需要用一双筷子。A先生只好清理了一下筷子,共N根,长度为T1,T2,T3,……,TN.现在他想用这些筷子组合成K+3双,使每双的筷子长度差的平方和最小。(怎么不是和最小??这要去问A先生了,呵呵)
输入
输入文件共有两行,第一行为两个用空格隔开的整数,表示N,K(1≤N≤100, 0<K<50),第二行共有N个用空格隔开的整数,为Ti.每个整数为1~50之间的数。
输出
输出文件仅一行。如果凑不齐K+3双,输出-1,否则输出长度差平方和的最小值。
样例
CHOP.IN
10 1
1 1 2 3 3 3 4 6 10 20
CHOP.OUT
5
说明
第一双 1 1
第二双 2 3
第三双 3 3
第四双 4 6
(1-1)^2+(2-3)^2+(3-3)^2+(4-6)^2=5
参考程序
var
n,k,i,j,t:longint;
a:array[0..100]of longint;
f:array[-1..100,0..100]of longint;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
begin
assign(input,'CHOP.in');
reset(input);
assign(output,'CHOP.out');
rewrite(output);
read(n,k);
k:=k+3;
for i:=1 to n do
read(a[i]);
for i:=1 to n do
for j:=n downto i+1 do
if a[j]<a[j-1] then
begin
t:=a[j];a[j]:=a[j-1];a[j-1]:=t;
end;
for i:=1 to n do
for j:=1 to n do
f[i,j]:=100000;
for i:=1 to n do
f[i,0]:=0;
for i:=1 to n do
for j:=1 to n do
if j*2<=i then
begin
f[i,j]:=min(f[i-2,j-1]+sqr(a[i-1]-a[i]),f[i-1,j]);
end;
if f[n,k]<>100000 then write(f[n,k]) else write(-1);
close(input);
close(output);
end.