fibonacci
N和M比较小,可以直接递推,还有同余。
Code
CONST FileName='fibonacci';
var f:array[-1..1000] of longint;
ans,n,i,m,p:longint;
BEGIN
Assign(input,FileName+'.in');
Assign(output,FileName+'.out');
Reset(input);Rewrite(output);
readln(n,p,m);ans:=-1;
f[-1]:=1;
for i:=1 to m do
begin
f[i]:=(f[i-1]+f[i-2])mod p;
if f[i]=n
then begin
ans:=i;
break;
end;
//writeln(i,' ',f[i]);
end;
writeln(ans);
Close(input);Close(output);
END.
gold
先考虑一维的情况,g[i]表示第i个格子上的金币数。然后我们用f[i][j]表示二维的情况,显然f[i][j]=g[i]*g[j]。题目要求找前K大,那我们就用前K大的g乘乘乘>_<,可以用堆,快拍似乎可以过。我不知道为什么runtime error,得了80分。
Codeprogram gold;
CONST FileName='gold';
maxn=9*9*9*9;
type shuzu=array[1..maxn*maxn] of longint;
Pointer=^shuzu;
var g:array[1..maxn] of longint;
f:array[1..maxn*maxn] of longint;
t,tot,i,j,m,n,k,h,count,ans:longint;
function calc(x:longint):longint;
begin
calc:=1;
while x>0 do
begin
calc:=calc*(x mod 10);
x:=x div 10;
end;
end;
procedure swap(var x,y:longint);
var t:longint;begin t:=x;x:=y;y:=t;end;
procedure qsort(p:Pointer;l,r:longint);
var i,j:integer;
mid:longint;
begin
i:=l;j:=r;mid:=P^[(l+r)>>1];
repeat
while(p^[i]>mid)and(i<r)do inc(i);
while(p^[j]<mid)and(l<j)do dec(j);
if i<=j then begin
swap(p^[i],p^[j]);
inc(i);dec(j);
end;
until i>j;
if i<r then qsort(p,i,r);
if j>l then qsort(p,l,j);
end;
BEGIN
Assign(input,FileName+'.in');
Assign(output,FileName+'.out');
Reset(input);Rewrite(output);
readln(n,m,h);
for i:=1 to n do
begin
t:=calc(i);
if(t>=1)and(t<=n) then
inc(g[t]);
end;
qsort(@g,1,n);
for i:=1 to m do
begin
if g[i]=0 then break;
for j:=1 to m do
begin
if g[j]=0 then break;
inc(tot);
f[tot]:=g[i]*g[j];
end;
end;
Qsort(@f,1,tot);
for i:=1 to m do
begin
inc(count,f[i]);
if (count>=h)and(ans=0)then ans:=i;
end;
if ans>0 then writeln(count,' ',ans)
else writeln(f[1]);
Close(input);Close(output);
END.
forest
传纸条的改编的。O(n^3)的DP,F[i][j][k]表示走i步,第一个人横坐标为j,第二个人为k,纵坐标可以算出来。
F[i][j][k]=max(f[i-1][j][k],F[i-1][j][k-1],F[i-1][j-1][k],F[i-1][j-1][k-1])+Abs(A[j][jy]-A[k][ky])(j<k);
F[i][j][k]=F[i-1][j-1][k](j=k)
由于问题的特殊,可以始终保持j<=k。而且注意有意义的j,k的取值范围。答案是F[n<<1-2][n][n]。
总结
45个人我考了280分Rank16,还可以。果然是水题欢乐赛啊,第一题第三题是一眼题,做第二题的时候一开始没看懂题,慌张了,以后要注意。