不是VIP会员,不能显示答案

题目解答

题目:
【猪圈】(2+2+3+3+3+3*16分)
小薇的外公有一个养猪场,一共养了C头猪,养猪场里有S个宽度都为1米的猪圈, 每个猪圈最多养1头猪。由于年久失修,猪圈前面的木护栏都需要更换了。
木材商最多只能提供给小薇的外公M块木板(每块木板的长度可以任意选择),外公当然想用最少的钱把那些有猪的猪圈前面用木板拦起来,外公想请小薇帮助计算一下,要把那些有猪的猪圈前面用木板拦起来,最少需要的木板总长度是多少?参加信息学奥赛的小薇当然会用程序来解决这个问题。
己知输入数据的第一行是三个整数M (1<=M<=50), S(1<=S<=200), C (1<=C<=S), 接下来共有C行,每行包含一个整数X (1<=X<=S),表示某头猪所在猪圈的编号。
小薇的程序要求能输出一行一个整数,表示所需木板的最小总长度。
请帮助小薇完善下面的程序。
输入样例1:
2 104
2
4
6
8
输出样例2:
6
【样例1数据说明】
由于最多只有两块板可以使用,所以第一块板将2到4号猪圈拦起来,第二块板将6到8号猪圈拦起来,这是需要木板总长度最少的方案,总共需要3+3=6米的长度。

输入样例2:
50 30 6
30
25
5
15
10
20
输出样例2:
6
【样例2数据说明】
由于最多可以使用50块板,而只有6个猪圈有猪。只要选择6块长度都为1米的木板, 依次将6个猪圈拦起来即可。最少的总长度就是1+1+1+1+1+1=6米。

program test_2011_6;
type arr=array[l.. 10000]of longint;
var
  a, b:arr;
  j,m, c, s, sum:longint;
  procedure swap(var x, y:longint);
  var
    t:longint;
  begin
    t:=x; x:=yy:=t ;
  end;
begin
  readln(m, s, c); sum:=0;
  if m>c then writeln( c )else
  begin
  for i:=l to c do readln(a[i]);
    for i:=l to c-1 do
	  for j:= c downto i+1 do
	    if a[j-l]>a[j] then swap(a[j-l], a[j]);
  j:=l;
  for i:=l to c-1 do
  begin
    b[j]:=a[i+l]-a[i];
	j:= j+1 ;
  end;
  for i:=l to c-2 do
    for j:=c-l downto i+1 do
	  if b[j-l]>b[j] then swap(b[j-l], b[j]);
  for j:=l to c-m do
  begin
    sum:=sum+b[j];
  end;
  writeln ( sum );
  end;
end.
考点:
分析:
解答:
评论:
老师: