回 帖 发 新 帖 刷新版面

主题:帮帮忙

题目描述

木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。木头长度的单位是cm。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数。 
输入描述

第一行是两个正整数N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。 接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
 

输出描述

输出能够切割得到的小段的最大长度。如果连1 cm长的小段都切不出来,输出"0"。
var
     n,k,i,l,jie:integer;
     a:array[1..10000] of integer;
     s:longint;
begin
     readln(n,k);
     for i:= 1 to n do begin
         readln(a[i]);
         s:=s+a[i];
     end;
     l:=s div k;
     while (jie<>k) or (l>0) do begin 
           jie:=0;
           for i:= 1 to n do
                          jie:=jie+(a[i] div l);
           l:=l-1;
     end;
     writeln(l);
end.
谁帮我找一下错误,总是通不过;

回复列表 (共2个回复)

沙发

大概看了一下,没跑你的程序,应该是这样的:

没说过一定要正好切成k段啊,举个例子:
N=3 K=4
a[1]=3
a[2]=4
a[3]=5
当l=3时,可以截得3段,但l=2时就变成了5段,故不一定jie=k就是解,而是jie刚刚>=k时就是解。

还有就是你没有搞清楚布尔运算,or是只要一个成立便成立的,故当jie即便等于k时,只要l>0仍然会继续循环。

所以循环条件应改为:while (jie<k) and (l>0) do......

另外,建议你养成个习惯,用ans代替jie作变量名。

板凳

谢,过了。真厉害!!!!!!!!!!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册