Maximum Tree Gym-101466B

Maximum Tree Gym-101466B


题目链接

题意:
求有根树最多可以有多少个结点。

做法:
一个样例来分析:
3
2 1 3
第一个3,说明这棵树有3层(不包括根节点)。
那么,我们是怎么得到这3层的呢?
根节点的子节点的个数是[2, 1, 3]中的一个,
我们假设是2,得到树的第一层。
这里写图片描述
第一层每个节点的子节点的个数是剩下的[1, 3]中的一个,
我们假设是1,得到树的第二层。
这里写图片描述

依此类推,直到用完数组中的元素。
(上面的假设得到的就是题目中的图一的树)
这里写图片描述
那么,我们要怎样才能使得树的结点最多呢?
一个自然的想法,我们让根节点拥有最多的孩子节点,得到第一层,
然后让第一层的每一个节点拥有次多的孩子节点,得到第二层,
依此类推,我们得到的就是拥有最多节点的树。

还是以样例来说明:
3
2 1 3
我们先把数组排序得到:
3 2 1

按照上面说的,我们得到下面这样一颗树:
这里写图片描述
树的节点个数为:

sum = 1 + 3 + 3*2 + 3*2*1。
上式中的各项分别对应于根节点,第一层,第二层,…,的节点个数。

#include <stdio.h>
#include <algorithm>
using namespace std;

bool  // 从大至小排序
cmp(int a, int b) {
    return a > b;
}

int
main() {
    int n, i;
    long long a[35], ans;

    scanf("%d", &n);
    for( i = 0; i < n; i++ ) {
        scanf("%lld", &a[i]);
    }
    sort(a, a + n, cmp);
    for( i = 1; i < n; i++ ) {
        a[i] = a[i] * a[i - 1];  //
    }
    ans = 1;
    for( i = 0; i < n; i++ ) {
        ans += a[i];
    }
    printf("%lld\n", ans);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值