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