1. 第1题:宁宁爱化学
宁宁很喜欢化学课。最近要做一个实验,他需要用到N化学物质。在实验的时候,他需要将所有化学物质主在桌面上,按次序排成一条直线。然而每一种化学物质都是危险品,对于第i个化学物质,如果有其它的化学化学物质与它的距离小于Ai,那么就会发生爆炸。
宁宁想知道要安全的完成他的实验,桌子最短可以多短。
【输入说明】
第1行 一个整数N,表示化学物质的个数;
第2行 有N个整数, 第i个整数Ai,表示第i个化学物质必须与其它化学物质保持的距离。
【输出说明】 ’
输出共一行一个整数, 表示能够让宁宁安全完成实验的桌子最小长度。
【样例输入】
表示;
3
3 1 2
【样例输出】
5
【程序清单】
var
n,i:longint;
ans:int64;
a:array[1..1000005] of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
else exit(b);
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
ans:=0;
for i:=2 to n do
ans:=ans+ max(a[i],a[i-1]) ;
writeln(ans);
end.
2. 第2题: 波波爱积木
波波有一款新式积木,每个积木上都有一个数,一天波波突发奇想,要是把所有的积木排成一排,所形成的数字串最大是多少呢?
不懂编程的波波找到了你,你的任务就是读入n个数字积木,求出所能形成的最大数。
【输入说明】
第i行是一个整数n(n≤1000),接下来n行每行是一个正整数。
【输出说明】
所能形成的最大整数。
【样例输入】
3
13
131
343
【祥例输出】
34313131
【程序清单】
const maxn=1005;
var a:array[0.. maxn] of string[205];
n:longint;
procedure init;
var i:longint;
begin
readln(n);
for i:=1 to n do readln(a[i]);
end;
procedure qsort(L, R:longint);
var i,j:longint;
mid:string;
begin
i:=L;j:=R;mid:=a[(L+R) div 2];
repeat
while (i<R)and( a[i]+mid>mid+a[i] ) do inc(i);
while (j>L)and( a[j]+mid<mid+a[j] ) do dec(j);
if i<=j then begin
a[0] :=a[i] ;a[i] :=a[j] ;a[j] :=a[0];
inc(i);
dec(j) ;
end;
until i>j;
if i<R then qsort(i, R);
if j>L then qsort(L, j);
end;
procedure print;
var i:longint;
begin
for i:=1 to n do write(a[i]);
end;
begin
init;
qsort(1,n);
print;
end.
3. 试题3 (注:本题初中生做):海海爱研究
海海是个爱研究的孩子,最近他在研究这么一个问题:一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
阵列
4 10
0234500067
1034560500
2045600671
0000000089
有4个细胞。
【输入说明】
第1行是两个整数m,n(m≤50,n≤80),接下来m行每行有n个数字。
【输出说明】
细胞数量。
【样例输入】
4 10
0234500067
1034560500
2045600671
0000000089
【样例输出】
4
【算法分析】
(1) 读入m*n矩阵阵列,将其转换为boolean矩阵存入bz数组中;
(2) 沿bz数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
(3) 将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase;
(4) 将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase;
(5) 重复4,直至h队空为止,则此时找出了一个细胞;
(6) 重复2,直至矩阵找不到细胞;
(7) 输出找到的细胞数。
【程序清单】
PROGRAM ZX2017P8;
const dx:array[1..4 of -1..1=(-1,0,1,0);
dy:array[1..4 of -1..1=(0,1,0,-1);
var
s:string;
pic:array[1..50,1..80] of integer;
bz: array[1..50,1..80] of boolean;
m,n,i,j,num: integer;
h:array[1..4000,1..2]of integer;
procedure doit(p,q:integer);
var i,t,w,x,y:integer;
begin
inc(num);
bz[p,q]:=false;
t:= i; w:=1; h[1,1]:=p; h[1,2]:=q;
repeat
for i :=1 to 4 do
begin
x:=h[t,1]+dx[i];
y:=h[t,2]+dy[i];
if (x>0) and (x<=m) and (y>0) and (y<=n) and bz[x,y] then
begin
inc(w);
h[w,1]:=x;
h[w,2]:=y;
bz[x,y]:=false;
end;
end;
inc(t);
until t>w;
end;
begin
fillchar(bz,sizeof(bz),true);
num:=0;
readln(m,n);
for i :=1 to m do
begin
readln(s)
for j:=l to n do
begin
pic[i,j]:=ord(s[j]) - 48;
if pic[i,j]=0 then
bz[i,j]:=false;
end;
end;
for i :=1 to m do
for j :=1 to n do
if bz[i,j] then
doit(i,j);
writeln(num);
end.