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