题意:给一个数组,这个数组是一棵树的BFS序列,每个节点的子节点必然从小到大遍历。请构造一棵树满足这个序列并且深度最小,输出深度
思路:
由于每个节点的子节点必然从小到大遍历,因此对于一段严格单增的区间,必然是放在同一个父节点下面最好。那么我们进行贪心,对于根节点,我们往里面放入第一段区间,然后记录其中的节点有多少个记录为p[1],对于接下去的p[1]个区间,我们都可以放在这个区间的下面,然后把这些放进去的所有区间总共有多少个记录为p[2]…以此类推,直到放完为止。最后输出我们的层数即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int h[200005];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int pre, x;
cin >> pre, n--;
int remain = 1;
int ptr = 1;
memset(h, 0, sizeof(h));
h[0] = 1;
//cout<<"1 ";
while (n--)
{
cin >> x;
if (x < pre)
h[ptr - 1]--;
if (h[ptr - 1] == 0)
ptr++;
//cout<<ptr<<" ";
pre = x;
h[ptr]++;
}
//cout<<endl;
cout << ptr << endl;
}
}
本题错误记录:上界记录错误,二十万写成了十万。