2016.08.14【初中部 NOIP提高组 】模拟赛C题解

    xiaoxiao2025-07-18  8

    这次比赛十分的呵呵,居然没上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
    转载请注明原文地址: https://ju.6miu.com/read-1300817.html
    最新回复(0)