Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:这样动规In Reply To:同学们,这个题目怎么做? Posted by:cathy at 2005-09-05 19:09:09 1.首先肯定要移到最大的所在的柱子上。 2.然后倒着扫一遍确定每个盘子当前需要移动到的目标柱。 3.最后正着动规算出答案完事。 关于第二步: 例如说,最大的盘子在3号柱,倒数第二大的在2号柱,那么倒数第二大的目标柱就是3号,那么之前一定需要把倒数第三大及以前的盘子都移到1号(只有这样倒数第二大的才能在2、3之间移动),所以倒数第三大的目标柱就是1号……依此类推,求出目标柱。 最后正着动规一遍,若目标柱与当前所在柱相同,不累加答案,若不同则f[i]:=f[i-1]+1+han3[i-1]; han3是预处理出的,一般的普通3塔游戏移动i个盘子的步数。 var a:array[1..3]of longint; b,c,f:array[0..100000]of longint; n,i,j,k,ans:longint; procedure scanf; begin read(n); for i:=1 to n do f[i]:=(2*f[i-1]+1)mod 1000000; for i:=1 to 3 do read(a[i]); for i:=1 to 3 do for j:=1 to a[i] do begin read(k); b[k]:=i; end; end; begin scanf; c[n]:=b[n]; writeln(b[n]); for i:=n-1 downto 1 do if b[i+1]=c[i+1] then c[i]:=b[i+1] else c[i]:=6-b[i+1]-c[i+1]; for i:=1 to n do if b[i]=c[i] then continue else ans:=(ans+1+f[i-1])mod 1000000; writeln(ans); end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator