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

这次比赛十分的呵呵,居然没上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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值