A 迷路的VariantF (P2011)
没什么好说的,把bit打包到byte里,其实我以前一直以为boolean是1 bit。比赛的时候写挂了。
Codevar n,i,j,h,t:integer;
dis,Q:array[1..1000] of integer;
map:array[0..125000] of byte;
ch:char;
procedure setbit(u,v:longint);
var t:longint;
begin
t:=(u-1)*n+v;
map[t>>3]:=map[t>>3] or(1<<(t and 7));
end;
function getbit(u,v:longint):boolean;
var t:longint;
begin
t:=(u-1)*n+v;
if((map[t>>3]>>(t and 7))and 1)=1
then exit(true)
else exit(false);
end;
begin
readln(N);
for i:=1 to N do
begin
dis[i]:=-1;
for j:=1 to N do
begin
read(ch);
if(ord(ch)<>ord('0'))
then setbit(i,j);
end;readln;end;
h:=0;t:=1;Q[1]:=1;dis[1]:=0;
while h<t do begin
inc(h);
for i:=1 to n do begin
if(getbit(Q[h],i))
and(dis[i]=-1)
then begin
dis[i]:=dis[Q[h]]+1;
inc(t);Q[t]:=i;
end;end;end;
writeln(dis[n]);
end.
B 矩阵交换 (P2012)
行列不影响。乱搞。
Codeprogram mc;
const maxn=700;
var A:array[1..maxn,1..maxn] of longint;
R,C:array[1..maxn] of longint;
i,j,n,k,x,y:longint;
ch:char;
procedure swap(var x,y:longint);
var t:longint;begin t:=x;x:=y;y:=t;end;
begin
readln(n,k);
for i:=1 to n do begin
for j:=1 to n do
read(A[i][j]);
readln;R[i]:=i;C[i]:=i;
end;
while k>0 do begin
readln(ch,x,y);
case ch of
'A':writeln(A[R[x]][C[y]]);
'R':swap(R[x],R[y]);
'C':swap(C[x],C[y]);
end;
dec(k);end;
end.
C 配对 (P2013)
F[i]表示做i,序列长度为偶数的最大的权值,G[i]为奇数。50分做法。
G[i]:=F[i-1]
F[i]:=max(F[i-1](删掉B[i]),max{G[j]+A[j]*B[i](保留B[i])})
斜率优化什么的无力了。
Codeprogram pair;
uses math;
const maxn=1000000;
var f,g:array[0..maxn] of int64;
A,B:array[1..maxn] of int64;
ans:int64;
i,j,n:longint;
begin
readln(n);
for i:=1 to n do read(A[i]);
for i:=1 to n do read(B[i]);
for i:=1 to n do begin
G[i]:=F[i-1];F[i]:=F[i-1];
for j:=0 to i-1 do
F[i]:=max(G[j]+A[j]*B[i],F[i]);
Ans:=max(F[i],ans);end;
writeln(ans);
end.
总结 200分还是很基础的,但是都写挂了,只有30分。要知道200分就排到25名了。敲之前要想清楚,写完代码要认真查错。