uva10603 Pascal代码(首发)
1 var a,b,c,d,h,t,p,q,qq,o,s1,s2,s3,abc:longint; 2 f:array[0..200,0..200]of longint; 3 f1,f2,f3:array[1..50000]of longint; 4 function min(a,b:longint):longint;begin if a<b then exit(a) else exit(b);end; 5 procedure asdf(x,y:longint); 6 begin 7 if(x=12)then //调试时加的,不要管它 8 begin 9 write; 10 end; 11 if(x>=q)and(x<=d)then 12 begin 13 if(y<qq)or(x>q)then 14 begin 15 qq:=y; 16 q:=x; 17 end; 18 end; 19 end; 20 begin 21 readln(abc); 22 for abc:=1 to abc do 23 begin 24 readln(a,b,c,d); 25 fillchar(f,sizeof(f),$7f); 26 f[0,0]:=0; 27 h:=0;t:=1; 28 f1[1]:=0;f2[1]:=0;f3[1]:=c; 29 q:=0;qq:=0; 30 if d>c then 31 q:=c; 32 if d=c then 33 writeln(0,' ',c) 34 else 35 begin 36 repeat 37 h:=h mod 50000+1; 38 s1:=f1[h];s2:=f2[h];s3:=f3[h]; 39 p:=min(s1,b-s2); 40 if(p>0)and(f[s1-p,s2+p]>f[s1,s2]+p)then 41 begin 42 t:=t mod 50000+1; 43 f1[t]:=s1-p;f2[t]:=s2+p;f3[t]:=s3; 44 f[s1-p,s2+p]:=f[s1,s2]+p; 45 o:=f[s1-p,s2+p]; 46 asdf(s1-p,o); 47 asdf(s2+p,o); 48 end; 49 p:=min(a-s1,s2); 50 if(p>0)and(f[s1+p,s2-p]>f[s1,s2]+p)then 51 begin 52 t:=t mod 50000+1; 53 f1[t]:=s1+p;f2[t]:=s2-p;f3[t]:=s3; 54 f[s1+p,s2-p]:=f[s1,s2]+p; 55 o:=f[s1+p,s2-p]; 56 asdf(s2-p,o); 57 asdf(s1+p,o); 58 end; 59 p:=min(s1,c-s3); 60 if(p>0)and(f[s1-p,s2]>f[s1,s2]+p)then 61 begin 62 t:=t mod 50000+1; 63 f1[t]:=s1-p;f2[t]:=s2;f3[t]:=s3+p; 64 f[s1-p,s2]:=f[s1,s2]+p; 65 o:=f[s1-p,s2]; 66 asdf(s1-p,o); 67 asdf(s3+p,o); 68 end; 69 p:=min(a-s1,s3); 70 if(p>0)and(f[s1+p,s2]>f[s1,s2]+p)then 71 begin 72 t:=t mod 50000+1; 73 f1[t]:=s1+p;f2[t]:=s2;f3[t]:=s3-p; 74 f[s1+p,s2]:=f[s1,s2]+p; 75 o:=f[s1+p,s2]; 76 asdf(s1+p,o); 77 asdf(s3-p,o); 78 end; 79 p:=min(s2,c-s3); 80 if(p>0)and(f[s1,s2-p]>f[s1,s2]+p)then 81 begin 82 t:=t mod 50000+1; 83 f1[t]:=s1;f2[t]:=s2-p;f3[t]:=s3+p; 84 f[s1,s2-p]:=f[s1,s2]+p; 85 o:=f[s1,s2-p]; 86 asdf(s2-p,o); 87 asdf(s3+p,o); 88 end; 89 p:=min(b-s2,s3); 90 if(p>0)and(f[s1,s2+p]>f[s1,s2]+p)then 91 begin 92 t:=t mod 50000+1; 93 f1[t]:=s1;f2[t]:=s2+p;f3[t]:=s3-p; 94 f[s1,s2+p]:=f[s1,s2]+p; 95 o:=f[s1,s2+p]; 96 asdf(s2+p,o); 97 asdf(s3-p,o); 98 end; 99 until h=t; 100 writeln(qq,' ',q); 101 end; 102 end; 103 end.
网上都简单地说了一句:DFS就好了,个人觉得太随便了,但自己想写时也只能说出这是DFS,
主要注意点:
1.存储二维即可(非要三维随你便)
2.时间几乎不用管,倒是剪枝很容易剪错
3.最佳更新状态时要注意: // ↓取自源码
if(x>=q)and(x<=d)then begin if(y<qq)or(x>q)then begin qq:=y; q:=x; end; end;
要求:水量在当前最佳与d之间
分类讨论
①当前=最佳 倒水量<最佳到水量 ->替换
②当前>最佳 直接替换
这个分类一定要分好,否则像我一样连错45遍

浙公网安备 33010602011771号