NOIP题解:2018T1(简单的分治递归)

一道简单的分治递归

2018NOIP提高组T1

题目大意及算法分析

这个题乍一看还不太懂咋做,看了样例的求解过程之后才明白,先找到最小的那个深度,先把它填满,然后以此为界,分成左右区间,然后递归处理,值得注意的是:递归出口的设置,当区间只剩下两个元素的时候,就直接加上最大值即可!

AC代码如下:

#include 
#include 
using namespace std;

const int maxn = 1e5 + 5;
int n, d[maxn], ans;

void solve_(int lo, int hi){
    int minv = 10005, pos = -1;
    if(hi - lo <= 1){
    	ans += max(d[lo], d[hi]);
    	return ;
	}
    for(int i = lo;i <= hi;i++){
        if(minv > d[i]){
            minv = d[i];
            pos = i;
        }
    }
    ans += minv;
    for(int i = lo;i <= hi;i++)
    	d[i] -= minv;
    solve_(lo, pos - 1);
    solve_(pos + 1, hi);
}

int main(){
    cin >> n;
    for(int i = 1;i <= n;i++)
        cin >> d[i];
    solve_(1, n);
    cout << ans;
    return 0;
}

你可能感兴趣的:(算法)