Minimal Height Tree

链接 : http://codeforces.com/problemset/problem/1437/D

标签 : trees greedy *1600

题意 :

用bfs序构造一棵树, 保证每个根节点的子节点按升序排列, 问高度最低是多少.

思路 :

先处理出一个记录每一个递增序列中元素个数的数组. 比如处理出 : 3 1 1 1 1 1 1. 在根节点下最多放3个子节点, 这是第一层, 然后第一层这三个节点又可以把后面3个1作为子节点, 作为第二层. 最后, 第二层这3个1又正好将最后3个1作为子节点, 作为第3层. 整个流程结束. 答案为 3.

思路感觉不难想到, 但是代码的实现细节需要仔细想好, 我在代码实现上就用了很长时间.

代码 :
#include <bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
inline int lowbit(int x) { return x & (-x); }
#define ll long long
#define pb push_back
#define PII pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f
const int N = 2e5 + 7;
int a[N];

int main() {	
    IO;
    int _;
    cin >> _;
    while (_--) {
        int n, cnt = 0, ans = 1;
        vector<int> v;
        v.pb(0);
        cin >> n;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
            if (a[i] > a[i - 1]) cnt++;
            else {
                v.pb(cnt);
                cnt = 1;
            }
        }
        v.pb(cnt);
        n = v.size() - 1;
        v[1]--;
        for (int i = 1; i <= n; ++i) v[i] += v[i - 1];
        int l = 0, r = 1, t;
        while (r < n) {
            t = r;
            r += v[r] - v[l];
            l = t;
            ans++;
        }
        cout << ans << endl;
    } 
    return 0;
}

posted @ 2020-11-13 14:41  phr2000  阅读(76)  评论(0编辑  收藏  举报