蓝桥杯 试题 历届真题 左儿子右兄弟

试题 历届真题 左孩子右兄弟

震惊:孩子居然是标题党的字。。。。CSDN不让标题有孩子。。

题目解释

资源限制

时间限制:1.0s 内存限制:256.0MB

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目可能乍看不是很懂。我先来把题目意思给说一下。(输入输出样例就不用我说了吧

反正死死地按着左孩子有右兄弟的规则,尽可能地把这个树画长一点。

  • 如果只有一个孩子,那好办,直接画在左边即可。
  • 如果有多个孩子呢?
通过对样例发现,2 3 4作为1的孩子,画的先后顺序还是有一定讲究的。
    
    通过我测试了几个,直接下结论,用左孩子右兄弟 画孩子结点,
    按照 孩子结点的下面所有结点数从少到多的顺序画
    
    ??????????????什么意思
    
    比如1,画它的孩子结点(2,3,4)中的一个
    孩子结点的下面所有结点数(就是2,3,4的下面所有结点的结点数) 
    2 -> 1   3-> 0   4->0
    所以,画孩子结点的优先级 4 == 3 > 2

例子:

例子1.

在这里插入图片描述

看这个例子,先画1:

在这里插入图片描述

画孩子结点,2,3,4 看谁下面的结点数少,就先画它,发现是 3, 然后是 2, 然后是4

在这里插入图片描述

如果下面节点数有一样的,那就先后无所谓了

最终结果

在这里插入图片描述

下面再给一个例子:

大家画画看看

在这里插入图片描述

结论:

发现结论

以例子1的树为例子

  • 第二层对高度的贡献值就是第二层的节点数;

  • 找 2 3 4 谁下面的节点数多,那么下一层对高度的贡献值就是结点多的,我们发现是4,有三个节点,
    对高度贡献值3,
    这样 3 + 3 = 6

以让大家画的树为例子:

二的结点有5个,3(1的孩子数)+5 = 8

代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e5+5;
vector<int> tree[N];
int n, father;

int findChils( int i )
{
	int ans = 0;
	for ( int k = 0; k < tree[i].size(); ++k ) {
		int child = tree[i][k];
		ans = max(ans, findChils(child));
	}
	return ans + tree[i].size();
}

int main()
{
	cin >> n;
	for ( int i = 2; i <= n; ++i ) {
		cin >> father;
		tree[father].push_back(i);
	}
//	for ( int i = 1; i <= n; ++i ) {
//		cout << i << "-->" << findChils(i) << endl;
//	}
	cout <<  findChils(1) << endl;
	return 0;
}
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值