切换到宽版
  • 14462阅读
  • 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.
      我是菜鸟啊,请各位大牛多多指导了,谢谢
离线hy6210cs
只看该作者 17 发表于: 2007-02-14
我的头都有点晕了~~~~
离线hy6210cs
只看该作者 16 发表于: 2007-02-04
9楼的~是不是从3医院跑出来的~太嚣张了~~~~```严重鄙视你~~~~~~~~~~~~~~~
离线hy6210cs
只看该作者 15 发表于: 2007-02-04
8楼的好凶呀
离线雨中浪子
只看该作者 14 发表于: 2006-11-27
我用C编的,你也可以看看
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"

FILE *fp;
int n,a[101],i,j,k,t=0,f=1,q,s;

in()
{fp=fopen("hebingguozi.in","r");
fscanf(fp,"%d",&n);
for(i=1;i<=n;i++)
fscanf(fp,"%d",&a);
fclose(fp);
}
out()
{fp=fopen("hebingguozi.out","w");
fprintf(fp,"%d",t);
fclose(fp);
}

main()
{in();
for(i=2;i<=n;i++)
{for(j=1;j<i;j++)
{if(a<a[j])
  {q=a;
  for(k=i;k>j;k--)
  a[k]=a[k-1];
  a[k]=q;
  }  
}
}
for(s=1;s<n;s++)
{a[1]=a[1]+a[2];
t=t+a[1];
for(i=2;i<n;i++)
  a=a[i+1];
a[n-s+1]=10000;
for(j=1;j<i;j++)
{if(a[1]>a[j]&&a[1]<=a[j+1])
  {q=a[1];
  for(k=1;k<j;k++)
  a[k]=a[k+1];
  a[k]=q;
  }
}
}
out();  
}
离线ybb
只看该作者 13 发表于: 2006-11-27
引用第8楼zhuang2006-11-14 20:12发表的:
我写了个,用快排和插排,速度也过得去.
program fruit;
var a:array[0..10000] of longint;
  f:text;
.......

给你300000的数据 还能过吗?
离线dog_yj
只看该作者 12 发表于: 2006-11-26
基数排序或者Heap....
离线408423211
只看该作者 11 发表于: 2006-11-16
我不是很会,但觉得冒泡排序是不是更好,排的同时算
离线水的味道
只看该作者 10 发表于: 2006-11-16
维护一个堆
离线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 字节
 
上一个 下一个