sicily 1137 河床 (二分分治)
生活随笔
收集整理的這篇文章主要介紹了
sicily 1137 河床 (二分分治)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《計算機算法設計與分析》啃書中。。。
有點看不進書,就來刷個水題吧,剛開始看錯題了還。
注意:是所有測量點相差均不大于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 }?
也不知道我是不是寫的有點麻煩。。。
轉載于:https://www.cnblogs.com/zmj97/p/5431888.html
總結
以上是生活随笔為你收集整理的sicily 1137 河床 (二分分治)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于在线预览word,excel,ppt
- 下一篇: iOS:ShareSDk的分享