《计算机算法设计与分析》啃书中。。。
有点看不进书,就来刷个水题吧,刚开始看错题了还。
注意:是所有测量点相差均不大于di而不是相邻两点。。。
1 //1137.河床 2 #include <iostream> 3 using namespace std; 4 5 int max_length(int d[], int l, int r, int m) { 6 //计算最大长度并返回 7 //d为保存高度的数组 8 //l为下标左界 9 //r为下标右界 10 //m为最大高度差 11 if (l==r) return 1; 12 if (l==r-1) { 13 if ((d[l]-d[r]<=m)&&(d[l]-d[r]>=-m)) return 2; 14 else return 1; 15 } 16 //二分 17 int mid = (l+r)/2; 18 int lm = max_length(d,l,mid,m); 19 int rm = max_length(d,mid+1,r,m); 20 int mm = 1; 21 int min , max; 22 min = max = d[mid]; 23 for (int i = mid-1; i >= l; i--) { 24 if ((d[i]>=max-m)&&(d[i]<=min+m)) { 25 ++mm; 26 if (d[i]<min) min = d[i]; 27 else if (d[i]>max) max = d[i]; 28 } 29 else break; 30 } 31 for (int i = mid+1; i <= r; i++) { 32 if ((d[i]>=max-m)&&(d[i]<=min+m)) { 33 ++mm; 34 if (d[i]<min) min = d[i]; 35 else if (d[i]>max) max = d[i]; 36 } 37 else break; 38 } 39 //返回最大值 40 return (lm>rm?lm:rm)>mm?(lm>rm?lm:rm):mm; 41 } 42 43 int main() { 44 int n, m; 45 cin>>n>>m; 46 int d[n]; 47 for (int i = 0; i < n; i++) cin>>d[i]; 48 cout<<max_length(d,0,n-1,m)<<endl; 49 return 0; 50 }
也不知道我是不是写的有点麻烦。。。