这次比赛十分的呵呵,居然没上200。。。第三题已坑杀无数小学生。。。 T1 比较水的前缀和。 a[i,j]表示第i行从j-c+1列到j列的和 b[i,j]表示第j列1~i行a[i,j]的和 最后累加b数组就AC了 T2 刚开始先计算转成10进制后和m取余的结果,如果为0就输出‘0 0’,否则就把它记录下来。 之后枚举i,j,只要把第i位和第j位的指数交换一下在判断,如果成立就直接输出再退出程序。 如果到最后都没有结果就直接输出‘-1 -1’ T3 过几年再写。。。 T4 这题就是SPFA在加上一些特殊的条件,循环队列开到十万就可以了。 先说说开的数组: A[i,j,k]:连接第i个节点的第j条路径。当k为1则代表路径编号,k为2则代表路径长度 B[i]:第i个节点连接的边的数量 C[i]:第i个节点初始的属性(为黑洞还是白洞) W[i]:第i个节点黑白洞的质量 S[i]:在第i个节点停留消耗的体力 D[i,j]:循环队列,i表示第i项,j为1表示当前所在节点编号,为2表示当前的时间为奇数还是偶数 F[i,j]:从1到第i个节点的最优解,j为奇偶性 每次循环枚举b[i],再计算当前路径所消耗的体力,最后特殊判断停留在当前节点的情况。 最后输出min(f[n,0],f[n,1])就AC了 附上核心代码(仅供参考,谢绝抄袭): while h<>t do begin inc(h); if h>100000 then h:=1; j:=d[h,1]; e:=d[h,2]; for i:=1 to b[j] do begin k:=a[j,i,1]; l:=a[j,i,2]; inc(t); if t>100000 then t:=1; d[t]:=d[h]; d[t,1]:=k; d[t,2]:=1-e; x:=(c[j]+e) mod 2; y:=(c[k]+e) mod 2; g:=abs(w[j]-w[k]); z:=l; if (x=0) and (y=1) then z:=z-g else if (x=1) and (y=0) then z:=z+g; if z<0 then z:=0; if f[k,d[t,2]]>f[j,e]+z then begin f[k,d[t,2]]:=f[j,e]+z; end else begin dec(t); if t=0 then t:=100000; end; end; inc(t); if t>100000 then t:=1; d[t]:=d[h]; d[t,2]:=1-e; z:=f[j,e]; if ((e+c[j]) mod 2)=1 then z:=z+s[j]; if z<f[j,d[t,2]] then f[j,d[t,2]]:=z else begin dec(t); if t=0 then t:=100000; end; end; 最后附一组测试数据: Input: 2 1 1 0 11 10 2 2 1 2 100 Output: 101