• 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 }

      也不知道我是不是写的有点麻烦。。。

  • 相关阅读:
    init进程解析rc文件的相关函数分析
    Ubuntu 安装Android Studio与使用手册
    Vim的撤销与重做
    Vim 配色设置与配色脚本语法
    js常用的语句
    xshell常用的命令
    java常用的语句
    maven工程配置日志
    根据一个oss的pdf文件的 地址转换成一个File文件
    根据一个oss的地址把图片转换成一个文件
  • 原文地址:https://www.cnblogs.com/zmj97/p/5431888.html
Copyright © 2020-2023  润新知