切换到宽版
  • 8819阅读
  • 9回复

复赛第一题energy(pascal)源程序。 如何测试数据? [复制链接]

上一主题 下一主题
离线genc
 
只看楼主 倒序阅读 0 发表于: 2006-11-18
数据应该是电脑自动测试吧?
那么程序中用不用加上这些代码:
assign(input,'energy.in');
assign(output,'energy.out');
reset(input);
rewrite(output)


第一题
我最后把总能量改成REAL了,本来我用的LONGINT,这样的输出会不会不标准?

我的程序:
PROGRAM energy (input,output);
Var
n,i,j,min:integer;
e:longint;
a:array [1..100] of integer;
te:array [1..100] of integer;
BEGIN
e:=0;
readln(n);
min:=1;
FOR i := 1 to n do
read(a);
repeat
For i:= 1 to n do
IF a<a[min] then min:=i;
IF min>1 THEN
IF min<n Then
e:=e+ a[min-1]*a[min+1]*a[min]
ELSE e:=e+ a[1]*a[min-1]*a[min]
ELSE e:=e+ a[n]*a[min+1]*a[min];
IF min=1 then
for i := 1 to n-1 do
te:= a[i+1]
ELSE IF min=n then
for i := 1 to n-1 do
te:= a
ELSE
begin
i:=1;
for i:= 1 to min do
te := a;
for i:= min+1 to n do
te := a
end;
n:=n-1 ;
For i := 1 to n do
a :=te ;
until n=1;
writeln(e);
END.

注:可能 是因为论坛的原因吧,程序中的两个方括号夹一个'i'都消失了,不过大家应该明白什么时候该有吧。

所用时间:一个半小时。
[ 此贴被genc在2006-11-18 16:40重新编辑 ]
离线genc
只看该作者 1 发表于: 2006-11-18
我的思路:利用数祖,不断进行循环(我没学过循环链表)、选择。每次循环比较出最小树,与左右相乘,然后把最小数去掉组成一个新数祖(用到中间数组te),然后从开始循环(利用REPEAT,我试过用FOR := 1 TO N-1,可是不行)。

我刚学PASCAL一个月,因此很多东西都不知道,希望各位高手站出来指教。
离线happypumpkin
只看该作者 2 发表于: 2006-11-18
我是让a N+1= a1 然后 看哪些能合 则合 和的时候找合著来最大的值 记入计数器,并把 a N+1 写成新的数组~~如此循环到N-1
离线qklxtlx
只看该作者 3 发表于: 2006-11-18
应该是动态规划~
离线qklxtlx
只看该作者 4 发表于: 2006-11-18
可惜我用了贪心啊~~失策
离线横飞天下
只看该作者 5 发表于: 2006-11-19
啊,我也用贪心啊,可那个动归好像怪怪的
离线joker
只看该作者 6 发表于: 2006-11-20
题意理解错误

哭泣`
离线genc
只看该作者 7 发表于: 2006-11-20
我连什么是贪心、动归都不知道.......
离线ybb
只看该作者 8 发表于: 2006-11-20
f[i,j]=opt{map[i,p].left*map[p+1,j].right*map[p+1].left+f[i,p]+f[p+1,j]}   (i<=p<j)
for i:=n-1 downto 1 do
begin
  for j:=i+1 to n do
    begin
      for p:=i-1 to j do
        begin
        ~~~~~~~~~~~~
\~~~~~~~~~~~~~~`
\~~~~~~~~~~~~~``
~~~~~~~~~~~~~
省略 ````````````
        end;
    end;
end;
离线ybb
只看该作者 9 发表于: 2006-11-21
f[i,j]=opt{map[i,p].left*map[p+1,j].right*map[p+1,j].left+f[i,p]+f[p+1,j]}   (i<=p<j)
sorry! shao da le yi ge "j"
快速回复
限100 字节
 
上一个 下一个