CF2133B Villagers题解
S1lver_W0lf · · 题解
CF2133B Villagers题解
题意
一个村庄里有
刚开始,村庄里的每一个村民都不是朋友。
Steve 可以选择两个村民
Steve 想要让村庄里的每一个人都成为朋友(可能有一些中间朋友)。
但是 Steve 不想让村庄经济膨胀太多,所以他想知道最少的绿宝石花费是多少。
形式化题意
有一个
每次连接
求将此图变为连通图的最小代价。
分析
考虑贪心。每次建边的花费是
这样处理过后,图中会有
代码部分
#include <bits/stdc++.h>
using namespace std;
int T;
void solve(){
int n;
cin >> n;
vector <int> a(n + 1);
for(int i = 1; i <= n; i++)
cin >> a[i];
sort(a.begin() + 1, a.end());//STL内置排序
long long ans = 0;
for(int i = n; i > 0; i -= 2)//这里条件不能写 i,因为当 n 为奇数时,会出现 i = -1 的情况
ans += a[i];//连接部分
cout << ans << endl;
}
int main(){
cin >> T;
while(T--){
solve();
}
return 0;
}