1.	(二维数组鞍点)给出一个N (N < l00)行M(M <100)列的二维数组,每个数组元素都是整数,编程寻找该二维数组中的鞍点。所谓二维数组的鞍点是指该位置上的元素值在其所在行上最大,在其所在列上最小。程序要求输出鞍点的位置和元素值。如果找不到,则输出“Not exist” 。例如下面输入第1行为二维数组的行数N 和列数M ,接下来N 行 M 列
表示二维数组,输出表示鞍点位置在数组的第1 行第4 列,元素值为4。同一行中相邻两个数字中间有一个空格,行末没有空格。
输入样例:
3 4
1 2 3 4
8 7 6 5
9 10 11 12
输出样例 
1 4 4
ar
  n, m, i, j: longint;
  a: array[1..100, 1..100] of longint; 
  row_max: array[1..100] of longint;
  //row_max [i]存储二维数组第i行中最大元素的列号
function check(i, j: longint): boolean;
//函数check检査在第j 列中是否元素a [i][j]最小
var
  k: longint;
  flag: boolean; 
begin
  flag:= true; 
  for k:= 1 to n do
  if  a[i,j]>a[k,j]  then
    begin
     flag := false;
     break;
    end;
    check := flag;
end;
begin
  readln(n, m); 
  for i := 1 to n do 
    for j := 1 to m do 
      read(a [i][j]);
  for i := 1 to n do 
  begin
      row_max[i]:=a[i,1]  ;
    for j:=2 to n do
      if a[i][j] > a[i][row_max[i]] then
        a[i][row_max[i]]:= j ;
  if check ( i,row_max[i] ) =true then
  begin
    writeln(i,' ',row_max[i],' ', a[i,row_max[i]] );
     halt ;
  end;
  end;
  writeln('Not exist');
end.
			
				
							  
							 
				
			
		 	
			
		
			
							 
				2.	(最大连续子序列和问题)给出包含n(n<100)个整数的序列a1,a2,a3,...an,其任意子序列可以表示为ai,ai+1,ai+2,...,aj,其中1 ≤ i ≤ j ≤ n。求所有连续子序列中元素之和的最大值。如果n 个整教都为负数,则输出0。例如序列-2, 11, -4, 13, -5, -2的连续子
序列11, -4 , 13 和最大,最大和为20。
输入样例:
6
-2 11 -4 13-5-2
输出样例:
20
算法分析:将给定的序列分成长度相等(或相差1个数)的左右两段,分别求出这两段的最大连续子序列和,则给定序列的最大连续子序列和有三种可能情况:
1 ) 与左半段的最大连续子序列和相同。
2 ) 与右半段的最大连续子序列和相同。
3 )  包含两部分,一部分在左半段中(子序列包含左半段的最后一个元素),另一部分在右半段中(子序列包含右半段的第一个元素)。
前两种情形我们可以用递归方法求出, 第三种情形可以分别求出左右两部分的最大连续子序列和后再相加。原序列的最大连续子序列和即为这三种情形的最大值。
var
  n, i: longint; 
  a: array[1..100] of longint; 
function getmax(a, b, c: longint): longint;
begin
  if a > b then
     if a > c then getmax := a else getmax :=c 
  else
     if b > c then getmax := b else getmax :=c;
end;
function search(L, R: longint): longint;
var
  Leftmaxsum: longint;// Leftmaxsum存储左半端的最大连续子序列和
  Rightmaxsum: longint;// Rightmaxsum存储右半端的最大连续子序列和
  mid, i, sum1, sum2, maxsum1, maxsum2: longint; 
begin
  if L = R then
     if a[L] > 0 then
        exit(a[L])
  else
       exit(0)  ; 
  mid := (L + R) div 2;
  Leftmaxsum := search(L, mid);
  Rightmaxsum := search(mid+1,R) ;
  sum1 := 0; sum2 := 0;
  maxsum1 := 0; maxsum2 := 0;
  for i := mid downto L do
  begin
     sum1:=sum1+a[i] ;
    if sum1 > maxsum1 then
	   maxsum1 := sum1;
  end;
  for i := mid + 1 to R do
  begin
    sum2 := sum2 + a[i];
    if sum2 > maxsum2 then
       maxsum2 := sum2;
   end;
   search := getmax (Leftmaxsum, Rightmaxsum, maxsum1+maxsum2 );
end;
begin
readln(n);
for i := 1 to n do
read(a[i]);
writeln ( search(1,n) );
end.