https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/MIT6_006F11_lec01.pdf

一维数组:如果a[ mid ] < a[ mid - 1 ] ,递归搜索左边,右边类似
a[ mid ] > a[ mid - 1 ] && a[ mid ] > a[ mid + 1 ] 时,即是一个顶点。

二维数组:
1)搜索中间列的最大值 MAX,判断与其左右的关系。
2)左右取大的一边继续搜索。转1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
#define sf(n) scanf("%d",&n)
#define pf(n) printf("%d",n)
#define fi(i,s,t) for(int i=s;i<t;i++)
const int INF=0x3f3f3f3f;
const int MAX=100;
int getMax(int a[][MAX],int n,int m,int &_max){
int index=-1;
fi(i,0,n)
if(a[i][m] > _max){
_max=a[i][m];
index=i;
}
return index;
}
int bs(int a[][MAX],int rows,int l,int r){
int _max = -INF,m=(l+r)/2;
int max_index=getMax(a,rows,m,_max);
if(m==0 || m == r) return _max;
if(a[max_index][m-1] > _max) return bs(a,rows,l,m-1);
return bs(a,rows,m+1,r);
}
int main(){
freopen("in","r",stdin);
int n,m,a[MAX][MAX];
sf(n);sf(m);
fi(i,0,n)
fi(j,0,m)
sf(a[i][j]);
pf(bs(a,n,0,m-1));
return 0;
}