切换到宽版
  • 14467阅读
  • 17回复

[在线等]关于04年合并果子的问题,请问我的程序有甚么问题 [复制链接]

上一主题 下一主题
离线lswforever
 
只看楼主 倒序阅读 0 发表于: 2006-11-09
如题,他不输出结果,无奈的
【问题描述】

  在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

  每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

  因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

  例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

【输入文件】

  输入文件fruit.in包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

【输出文件】

  输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。

【样例输入】

3
1 2 9

【样例输出】

15

【数据规模】

对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。



以下为我写的程序
program fruit;
var f,s:array[1..20000] of integer;
  a,b,i,t,n,q:longint;
{----------------------------------------------}
procedure swap(a,b:integer);
var t:integer;
begin
t:=a;a:=b;b:=t;
end;
procedure paixu(n:integer;var s:array of longint);
var i,j:integer;
begin
  for i:=1 to n-1 do
  for j:= i+1 to n do
  if s[i]>s[j] then swap(s[i],s[j])
  end;
{----------------------------------------------}
begin
read(n);
for i:= 1 to n do read(f[i]);
i:=1;
repeat
paixu(n,f);
a:=s[i];b:=s[i+1];
t:=a+b;
i:=i+1;
for q:=1 to n do f[q]:=s[q+2];
until b=0;
write('zonghe',t);
end.
      我是菜鸟啊,请各位大牛多多指导了,谢谢
离线william
只看该作者 1 发表于: 2006-11-11
procedure swap(a,b:integer);
改为:
procedure swap(var a,b:integer);
离线romanking
只看该作者 2 发表于: 2006-11-11
选择排序太慢,堆排
离线stevenjl

只看该作者 3 发表于: 2006-11-11
快排也可以
Dream Walker...
离线沂南
只看该作者 4 发表于: 2006-11-12
我也是菜
但我觉得主程序里面好像没有S这个数组吧
过程里面的应该不能直接拿出来吧

还有就是2楼那个问题
离线流星揽月
只看该作者 5 发表于: 2006-11-14
???/
离线archimedes

只看该作者 6 发表于: 2006-11-14
引用第1楼william2006-11-11 16:25发表的:
procedure swap(a,b:integer);
改为:
procedure swap(var a,b:integer);

yes
离线filippo31
只看该作者 7 发表于: 2006-11-14
程序太慢了,应该用堆排序最好!
离线zhuang
只看该作者 8 发表于: 2006-11-14
我写了个,用快排和插排,速度也过得去.
program fruit;

var a:array[0..10000] of longint;
  f:text;
  n,total:longint;
  i:integer;

procedure swap(var a,b:longint);  
var t:integer;
begin
t:=a; a:=b; b:=t
end;

procedure quick_sort(m,n:integer);
var i,j,x:integer;
begin
i:=m; j:=n; x:=a[(i+j) div 2];
repeat
  while a[i]>x do inc(i);
  while x>a[j] do dec(j);
  if i<=j then begin
    swap(a[i],a[j]);
    inc(i); dec(j)
  end;
until i>j;
if m<j then sort(m,j);
if i<n then sort(i,n);
end;

procedure insert_sort(n:integer);
var i,j:integer;
begin
i:=n-1; a[0]:=a[n];
while a[i]<a[0] do begin
  a[i+1]:=a[i];
  dec(i)
end;
a[i+1]:=a[0]
end;

begin
assign(f,'fruit10.in'); reset(f);
readln(f,n);
for i:=1 to n do
  read(f,a[i]);
close(f);
quick_sort(1,n);
for i:=1 to n-1 do begin
  a[n-i]:=a[n-i]+a[n-i+1];
  a[n-i+1]:=0;
  inc(total,a[n-i]);
  insert_sort(n-i)
end;
assign(f,'fruit.out'); rewrite(f);
writeln(f,total);
close(f)
end.
...多思考,少说话...
离线jimjim168
只看该作者 9 发表于: 2006-11-15
引用第1楼william2006-11-11 16:25发表的:
procedure swap(a,b:integer);
改为:
procedure swap(var a,b:integer);



说的太好了!!!!!
大牛大牛!!!!!

[p:1][p:1][p:1][p:3][p:3][p:3]
快速回复
限100 字节
 
上一个 下一个