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.