1. (神奇的幻方)幻方是一种很神奇的N*N矩阵:它由数字1,2,3,...,N*N构成,且每行、每列及两条对角线上的数字之和都相同。
当N为奇数时,我们可以通过以下方法构建一个幻方:
首先将1写在第一行的中间。之后,按如下方式从小到大依次填写每个数(K=1,2,3,N*N);
1.若(K-1)在第一行但不在最后一列则将填在最后一行,(k—1)所在列的右一列;
2.若(K-1)在最后一列但不在第一行,则将填在第一列,(K-1)所在行的上一行;
3.若(K-1)在第一行最后一列,则将填在(K-1)的正下方;
4.若(K-1)既不在第一行,也不在最后一列,如果(K-1)的右上方还未填数,则将K填在(K-1)的右上方,否则将填在的正下方。
现给定N(奇数),请按上述方法构t造N*N的幻方。
样例输入:N=3
样例输出:
8 1 6
3 5 7
4 9 2
var
n,x,y,k:longint;
a:array[1..39,1..39] of integer;
begin
readln(n);
y:= (n+1) div 2 ; x:=1;
a[x,y]:=1;
for k:=2 to n*n do
begin
if ( x=1 ) and (y<>n) then
begin
x:=n; inc(y);
end
else if (y=n) and (x<>1) then
begin
y:=1; dec(x);
end
else if (x=1) and (y=n) then inc(x)
else if a[x-1,y+1]=0 then
begin
dec(x) ; inc(y);
end
else inc(x) ;
a[x,y]:=k;
end;
for x:=1 to n do
begin
for y:=1 to n do write( a[x,y] ,' ');
writeln;
end;
end.
2. (跳石头)这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会己经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有N块岩石(不含起
点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点到终点之间移走M块岩石(不能移走起点和终点的岩石)。
输入第一行包含三个整数L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。
接下来一行,N个整数,第i个整数Di(0<Di<L)表示第i块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
【样例输入】
25 5 2
2 11 14 17 21
【样例输出】
4
将与起点距离为2和14的两个岩石移走后,最短的跳跃距离为4 (从与起点距离17的岩石跳到距离21的岩石,或者从距离21的岩石跳到终点)。
算法:由于答案是线性的,可以二分枚举最终答案,再每次验证答案的正确性,从而逼近直到确定最终的最长距离。
var
d:array[0..100005] of longint;
i,Len,n,m,l,r,mid:longint;
function check(ans:longint):boolean;//判断 ans 是否为可行的答案
var
i,last,tot:longint;
begin
last:=0; tot:=0;
for i:=1 to n do
if (d[i]-last>=ans) then last:=d[i]
else inc(tot) ;
if Len-last<ans then inc(tot);
if (tot<=m) then exit ( true )
else exit(false);
end;
begin
readln(Len,n,m);
for i:=1 to n do read(d[i]);
d[n+1]:=Len;
l:=0; r:=len;
while l<r do
begin
mid:= (l+r+1) div 2 ;
if (check(mid)) then l:=mid
else r:= mid-1 ;
end;
writeln(l);
end.