观察到性质:每个点都会被算至少一次,因为将其变成单点的一步一定计入了这个点的贡献
所以最优解就是以最小的点为根,让其它点作为叶子一个一个打掉,这样除了最小的点,每个点都只被算一次。而这个可以直接通过 a 数组的最小值和总和得出。甚至不需要输入树,也不需要存储 a 数组
#include <iostream>
using namespace std;
using ll = long long;
int n;
void Solve() {
cin >> n;
int a;
cin >> a;
ll suma = a;
int mina = a;
for (int i = 1; i < n; i++) {
cin >> a;
suma += a;
mina = min(mina, a);
}
cout << (ll)(n - 2) * mina + suma;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Solve();
return 0;
}

京公网安备 11010502036488号