这次比赛十分的呵呵,居然没上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
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