讨论 / 为啥我这题目只有20分?
abcwuhang 2009-10-05 05:52:00
点我顶贴 收藏 删除
program rq175;

type node=record

name:array [1..3] of string;

data:longint;

end;

link=^node2;

node2=record

data:string;

wz:integer;

next:link;

end;

var b:array [1..250] of node;

a:array [1..199] of string;

f:array [1..199,1..199] of longint;

st:string;

ch:char;

m,i,n:integer;

j,ans:longint;

pp,qq,head:link;

function save2(l:string;var top:integer):boolean;

var k,code:integer;

begin

if b[i].name[top][1]=’0’ then top:=top-1 else

if b[i].name[top][2] in [’0’..’9’] then exit(true) else

if b[i].name[top][1] in [’4’..’9’] then exit(true) else

if b[i].name[top][1] in [’1’..’3’] then

begin

val(copy(b[i].name[top],1,1),k,code);

delete(b[i].name[top],1,1);

delete(l,1,1);

while k>1 do

begin

top:=top+1;

b[i].name[top]:=l;

k:=k-1;

end;

end;

if top>3 then exit(true)

else exit(false);

end;

function check:boolean;

var k,r:integer;

flag:boolean;

begin

for k:=1 to 3 do

begin

flag:=false;

for r:=1 to n do

if b[i].name[k]=a[r] then

begin

flag:=true;

break;

end;

if not(flag) then exit(true);

end;

exit(false);

end;

function save(l,r:string):boolean;

var top,code:integer;

begin

top:=0;

while (pos(’+’,l)>0) and (top<=2) do

begin

top:=top+1;

b[i].name[top]:=copy(l,1,pos(’+’,l)-1);

if save2(b[i].name[top],top) then exit(true);

delete(l,1,pos(’+’,l));

end;

top:=top+1;

b[i].name[top]:=l;

if save2(l,top) then exit(true);

if top<>3 then exit(true);

if check then exit(true);

if r[1]=’+’ then

begin

delete(r,1,1);

val(r,b[i].data,code);

end

else

begin

if r[1]=’-’ then delete(r,1,1);

val(r,b[i].data,code);

b[i].data:=-b[i].data;

end;

exit(false);

end;

function max(l,r:longint):longint;

begin

if l>r then exit(l);

exit(r);

end;

function give(x,y,z:integer):longint;

var k:integer;

begin

for k:=1 to m do

if (b[k].name[1]=a[x]) and (b[k].name[2]=a[y]) and (b[k].name[3]=a[z]) or (b[k].name[1]=a[x]) and (b[k].name[2]=a[z]) and (b[k].name[3]=a[y]) or (b[k].name[1]=a[y]) and (b[k].name[2]=a[x]) and (b[k].name[3]=a[z]) or

(b[k].name[1]=a[y]) and (b[k].name[2]=a[z]) and (b[k].name[3]=a[x]) or (b[k].name[1]=a[z]) and (b[k].name[2]=a[x]) and (b[k].name[3]=a[y]) or (b[k].name[1]=a[z]) and (b[k].name[2]=a[y]) and (b[k].name[3]=a[x]) then exit(b[k].data);

exit(0);

end;

function digit(p:link):longint;

var q,r,s,t:link;

sum:longint;

begin

if p=nil then exit(0);

if p^.next=nil then exit(0);

if p^.next^.next=nil then exit(0);

if p^.next^.next^.next=nil then exit(give(p^.wz,p^.next^.wz,p^.next^.next^.wz));

q:=p;

r:=nil;

sum:=0;

while (q^.next<>nil) and (q^.next^.next<>nil) and (q^.next^.next^.next<>nil) do

begin

new(t);

t^.data:=q^.data;

t^.wz:=q^.wz;

t^.next:=q^.next^.next^.next;

if r=nil then

begin

r:=t;

s:=r;

end

else

begin

r^.next:=t;

r:=t;

end;

sum:=max(sum,digit(s)+give(q^.wz,q^.next^.wz,q^.next^.next^.wz));

q:=q^.next;

end;

digit:=sum;

end;

begin

readln(n);

for i:=1 to n do

a[i]:=’’;

i:=1;

while not(eoln) do

begin

read(ch);

if ch<>’ ’ then a[i]:=a[i]+ch

else if a[i]<>’’ then i:=i+1;

end;

ans:=0;

for i:=1 to n do

begin

read(j);

ans:=ans+j;

end;

readln(m);

i:=1;

j:=1;

while j<=m do

begin

readln(st);

if save(copy(st,1,pos(’->’,st)-1),copy(st,pos(’->’,st)+2,length(st))) then i:=i-1;

i:=i+1;

j:=j+1;

end;

m:=i-1;

new(pp);

new(qq);

qq^.data:=a[1];

qq^.next:=nil;

qq^.wz:=1;

pp:=qq;

head:=pp;

i:=1;

while i<n do

begin

i:=i+1;

new(qq);

qq^.data:=a[i];

qq^.next:=nil;

qq^.wz:=i;

pp^.next:=qq;

pp:=qq;

end;

writeln(ans+digit(head));

end.

是输入数据读错吗,还是动归错误?请大牛指教。

#1 abcwuhang@2009-09-11 20:45:00
回复 删除
附加一下解释:

save、save2、check是读入转换方式。

其中check是检查当前方式中有没有出现没有的元素。。有则删除此方式(因为不可能用到此方式)

give是赋值(在转换方式表里寻找能量转变值,若没有则输出0)

digit是递归过程(类似动归),

但评测器说我只对2个点,另有4个超时、4个错误答案,为什么啊啊,请大牛赐教(*^__^*)

#2 abcwuhang@2009-10-05 05:52:00
回复 删除
顶上来
查看更多回复
提交回复